blob: be410ea1c457ec106ab76fc298beface535230cc [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.6) on Mon Mar 23 13:31:56 EDT 2020 -->
<title>AbstractRememberMeManager (Apache Shiro 1.5.2 API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2020-03-23">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../jquery/jquery-3.3.1.js"></script>
<script type="text/javascript" src="../../../../jquery/jquery-migrate-3.0.1.js"></script>
<script type="text/javascript" src="../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="AbstractRememberMeManager (Apache Shiro 1.5.2 API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":6,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":6,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":6,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/AbstractRememberMeManager.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.shiro.mgt</a></div>
<h2 title="Class AbstractRememberMeManager" class="title">Class AbstractRememberMeManager</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang" class="externalLink">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>org.apache.shiro.mgt.AbstractRememberMeManager</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code><a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></code></dd>
</dl>
<dl>
<dt>Direct Known Subclasses:</dt>
<dd><code><a href="../web/mgt/CookieRememberMeManager.html" title="class in org.apache.shiro.web.mgt">CookieRememberMeManager</a></code></dd>
</dl>
<hr>
<pre>public abstract class <a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.64">AbstractRememberMeManager</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang" class="externalLink">Object</a>
implements <a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></pre>
<div class="block">Abstract implementation of the <code>RememberMeManager</code> interface that handles
<a href="#setSerializer(org.apache.shiro.io.Serializer)"><code>serialization</code></a> and
<a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>encryption</code></a> of the remembered user identity.
<p/>
The remembered identity storage location and details are left to subclasses.
<h2>Default encryption key</h2>
This implementation uses an <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a> for strong encryption by default. It also
uses a default generated symmetric key to both encrypt and decrypt data. As AES is a symmetric cipher, the same
<code>key</code> is used to both encrypt and decrypt data, BUT NOTE:
<p/>
Because Shiro is an open-source project, if anyone knew that you were using Shiro's default
<code>key</code>, they could download/view the source, and with enough effort, reconstruct the <code>key</code>
and decode encrypted data at will.
<p/>
Of course, this key is only really used to encrypt the remembered <code>PrincipalCollection</code> which is typically
a user id or username. So if you do not consider that sensitive information, and you think the default key still
makes things 'sufficiently difficult', then you can ignore this issue.
<p/>
However, if you do feel this constitutes sensitive information, it is recommended that you provide your own
<code>key</code> via the <a href="#setCipherKey(byte%5B%5D)"><code>setCipherKey</code></a> method to a key known only to your application,
guaranteeing that no third party can decrypt your data. You can generate your own key by calling the
<code>CipherService</code>'s <a href="../crypto/AbstractSymmetricCipherService.html#generateNewKey()"><code>generateNewKey</code></a> method
and using that result as the <a href="#setCipherKey(byte%5B%5D)"><code>cipherKey</code></a> configuration attribute.</div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>0.9</dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">AbstractRememberMeManager</a></span>()</code></th>
<td class="colLast">
<div class="block">Default constructor that initializes a <a href="../io/DefaultSerializer.html" title="class in org.apache.shiro.io"><code>DefaultSerializer</code></a> as the <a href="#getSerializer()"><code>serializer</code></a> and
an <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a> as the <a href="#getCipherService()"><code>cipherService</code></a>.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>protected <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#convertBytesToPrincipals(byte%5B%5D,org.apache.shiro.subject.SubjectContext)">convertBytesToPrincipals</a></span>&#8203;(byte[]&nbsp;bytes,
<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</code></th>
<td class="colLast">
<div class="block">If a <a href="#getCipherService()"><code>cipherService</code></a> is available, it will be used to first decrypt the byte array.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>protected byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#convertPrincipalsToBytes(org.apache.shiro.subject.PrincipalCollection)">convertPrincipalsToBytes</a></span>&#8203;(<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;principals)</code></th>
<td class="colLast">
<div class="block">Converts the given principal collection the byte array that will be persisted to be 'remembered' later.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>protected byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#decrypt(byte%5B%5D)">decrypt</a></span>&#8203;(byte[]&nbsp;encrypted)</code></th>
<td class="colLast">
<div class="block">Decrypts the byte array using the configured <a href="#getCipherService()"><code>cipherService</code></a>.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>protected <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#deserialize(byte%5B%5D)">deserialize</a></span>&#8203;(byte[]&nbsp;serializedIdentity)</code></th>
<td class="colLast">
<div class="block">De-serializes the given byte array by using the <a href="#getSerializer()"><code>serializer</code></a>'s
<a href="../io/Serializer.html#deserialize(byte%5B%5D)"><code>deserialize</code></a> method.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>protected byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#encrypt(byte%5B%5D)">encrypt</a></span>&#8203;(byte[]&nbsp;serialized)</code></th>
<td class="colLast">
<div class="block">Encrypts the byte array by using the configured <a href="#getCipherService()"><code>cipherService</code></a>.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>protected abstract void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forgetIdentity(org.apache.shiro.subject.Subject)">forgetIdentity</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject)</code></th>
<td class="colLast">
<div class="block">Forgets (removes) any remembered identity data for the specified <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCipherKey()">getCipherKey</a></span>()</code></th>
<td class="colLast">
<div class="block">Convenience method that returns the cipher key to use for <em>both</em> encryption and decryption.</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code><a href="../crypto/CipherService.html" title="interface in org.apache.shiro.crypto">CipherService</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCipherService()">getCipherService</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the <code>CipherService</code> to use for encrypting and decrypting serialized identity data to prevent easy
inspection of Subject identity data.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getDecryptionCipherKey()">getDecryptionCipherKey</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the decryption cipher key to use for decryption operations.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getEncryptionCipherKey()">getEncryptionCipherKey</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the cipher key to use for encryption operations.</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>protected <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getIdentityToRemember(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationInfo)">getIdentityToRemember</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;info)</code></th>
<td class="colLast">
<div class="block">Returns <code>info</code>.<a href="../authc/AuthenticationInfo.html#getPrincipals()"><code>getPrincipals()</code></a> and
ignores the <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> argument.</div>
</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code><a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getRememberedPrincipals(org.apache.shiro.subject.SubjectContext)">getRememberedPrincipals</a></span>&#8203;(<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</code></th>
<td class="colLast">
<div class="block">Implements the interface method by first <a href="#getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)"><code>acquiring</code></a>
the remembered serialized byte array.</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>protected abstract byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)">getRememberedSerializedIdentity</a></span>&#8203;(<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</code></th>
<td class="colLast">
<div class="block">Based on the given subject context data, retrieves the previously persisted serialized identity, or
<code>null</code> if there is no available data.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code><a href="../io/Serializer.html" title="interface in org.apache.shiro.io">Serializer</a>&lt;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getSerializer()">getSerializer</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances for
persistent remember me storage.</div>
</td>
</tr>
<tr id="i14" class="altColor">
<td class="colFirst"><code>protected boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isRememberMe(org.apache.shiro.authc.AuthenticationToken)">isRememberMe</a></span>&#8203;(<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token)</code></th>
<td class="colLast">
<div class="block">Determines whether or not remember me services should be performed for the specified token.</div>
</td>
</tr>
<tr id="i15" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onFailedLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationException)">onFailedLogin</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationException.html" title="class in org.apache.shiro.authc">AuthenticationException</a>&nbsp;ae)</code></th>
<td class="colLast">
<div class="block">Reacts to a failed login by immediately <a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgetting</code></a> any
previously remembered identity.</div>
</td>
</tr>
<tr id="i16" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onLogout(org.apache.shiro.subject.Subject)">onLogout</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject)</code></th>
<td class="colLast">
<div class="block">Reacts to a subject logging out of the application and immediately
<a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgets</code></a> any previously stored identity and returns.</div>
</td>
</tr>
<tr id="i17" class="rowColor">
<td class="colFirst"><code>protected <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onRememberedPrincipalFailure(java.lang.RuntimeException,org.apache.shiro.subject.SubjectContext)">onRememberedPrincipalFailure</a></span>&#8203;(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang" class="externalLink">RuntimeException</a>&nbsp;e,
<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;context)</code></th>
<td class="colLast">
<div class="block">Called when an exception is thrown while trying to retrieve principals.</div>
</td>
</tr>
<tr id="i18" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onSuccessfulLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)">onSuccessfulLogin</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;info)</code></th>
<td class="colLast">
<div class="block">Reacts to the successful login attempt by first always <a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgetting</code></a> any previously
stored identity.</div>
</td>
</tr>
<tr id="i19" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)">rememberIdentity</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;authcInfo)</code></th>
<td class="colLast">
<div class="block">Remembers a subject-unique identity for retrieval later.</div>
</td>
</tr>
<tr id="i20" class="altColor">
<td class="colFirst"><code>protected void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.subject.PrincipalCollection)">rememberIdentity</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;accountPrincipals)</code></th>
<td class="colLast">
<div class="block">Remembers the specified account principals by first
<a href="#convertPrincipalsToBytes(org.apache.shiro.subject.PrincipalCollection)"><code>converting</code></a> them to a byte
array and then <a href="#rememberSerializedIdentity(org.apache.shiro.subject.Subject,byte%5B%5D)"><code>remembers</code></a> that
byte array.</div>
</td>
</tr>
<tr id="i21" class="rowColor">
<td class="colFirst"><code>protected abstract void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#rememberSerializedIdentity(org.apache.shiro.subject.Subject,byte%5B%5D)">rememberSerializedIdentity</a></span>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
byte[]&nbsp;serialized)</code></th>
<td class="colLast">
<div class="block">Persists the identity bytes to a persistent store for retrieval later via the
<a href="#getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)"><code>getRememberedSerializedIdentity(SubjectContext)</code></a> method.</div>
</td>
</tr>
<tr id="i22" class="altColor">
<td class="colFirst"><code>protected byte[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#serialize(org.apache.shiro.subject.PrincipalCollection)">serialize</a></span>&#8203;(<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;principals)</code></th>
<td class="colLast">
<div class="block">Serializes the given <code>principals</code> by serializing them to a byte array by using the
<a href="#getSerializer()"><code>serializer</code></a>'s <a href="../io/Serializer.html#serialize(T)"><code>serialize</code></a> method.</div>
</td>
</tr>
<tr id="i23" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setCipherKey(byte%5B%5D)">setCipherKey</a></span>&#8203;(byte[]&nbsp;cipherKey)</code></th>
<td class="colLast">
<div class="block">Convenience method that sets the cipher key to use for <em>both</em> encryption and decryption.</div>
</td>
</tr>
<tr id="i24" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setCipherService(org.apache.shiro.crypto.CipherService)">setCipherService</a></span>&#8203;(<a href="../crypto/CipherService.html" title="interface in org.apache.shiro.crypto">CipherService</a>&nbsp;cipherService)</code></th>
<td class="colLast">
<div class="block">Sets the <code>CipherService</code> to use for encrypting and decrypting serialized identity data to prevent easy
inspection of Subject identity data.</div>
</td>
</tr>
<tr id="i25" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDecryptionCipherKey(byte%5B%5D)">setDecryptionCipherKey</a></span>&#8203;(byte[]&nbsp;decryptionCipherKey)</code></th>
<td class="colLast">
<div class="block">Sets the decryption key to use for decryption operations.</div>
</td>
</tr>
<tr id="i26" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEncryptionCipherKey(byte%5B%5D)">setEncryptionCipherKey</a></span>&#8203;(byte[]&nbsp;encryptionCipherKey)</code></th>
<td class="colLast">
<div class="block">Sets the encryption key to use for encryption operations.</div>
</td>
</tr>
<tr id="i27" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setSerializer(org.apache.shiro.io.Serializer)">setSerializer</a></span>&#8203;(<a href="../io/Serializer.html" title="interface in org.apache.shiro.io">Serializer</a>&lt;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&gt;&nbsp;serializer)</code></th>
<td class="colLast">
<div class="block">Sets the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances for
persistent remember me storage.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang" class="externalLink">Object</a></h3>
<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang" class="externalLink">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang" class="externalLink">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang" class="externalLink">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang" class="externalLink">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang" class="externalLink">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang" class="externalLink">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang" class="externalLink">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang" class="externalLink">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait(long,int)" title="class or interface in java.lang" class="externalLink">wait</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.org.apache.shiro.mgt.RememberMeManager">
<!-- -->
</a>
<h3>Methods inherited from interface&nbsp;org.apache.shiro.mgt.<a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></h3>
<code><a href="RememberMeManager.html#forgetIdentity(org.apache.shiro.subject.SubjectContext)">forgetIdentity</a></code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>AbstractRememberMeManager</h4>
<pre>public&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.95">AbstractRememberMeManager</a>()</pre>
<div class="block">Default constructor that initializes a <a href="../io/DefaultSerializer.html" title="class in org.apache.shiro.io"><code>DefaultSerializer</code></a> as the <a href="#getSerializer()"><code>serializer</code></a> and
an <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a> as the <a href="#getCipherService()"><code>cipherService</code></a>.</div>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="getSerializer()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSerializer</h4>
<pre class="methodSignature">public&nbsp;<a href="../io/Serializer.html" title="interface in org.apache.shiro.io">Serializer</a>&lt;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.112">getSerializer</a>()</pre>
<div class="block">Returns the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances for
persistent remember me storage.
<p/>
Unless overridden by the <a href="#setSerializer(org.apache.shiro.io.Serializer)"><code>setSerializer(org.apache.shiro.io.Serializer&lt;org.apache.shiro.subject.PrincipalCollection&gt;)</code></a> method, the default instance is a
<a href="../io/DefaultSerializer.html" title="class in org.apache.shiro.io"><code>DefaultSerializer</code></a>.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances for
persistent remember me storage.</dd>
</dl>
</li>
</ul>
<a id="setSerializer(org.apache.shiro.io.Serializer)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSerializer</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.125">setSerializer</a>&#8203;(<a href="../io/Serializer.html" title="interface in org.apache.shiro.io">Serializer</a>&lt;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&gt;&nbsp;serializer)</pre>
<div class="block">Sets the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances for
persistent remember me storage.
<p/>
Unless overridden by this method, the default instance is a <a href="../io/DefaultSerializer.html" title="class in org.apache.shiro.io"><code>DefaultSerializer</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>serializer</code> - the <code>Serializer</code> used to serialize and deserialize <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a> instances
for persistent remember me storage.</dd>
</dl>
</li>
</ul>
<a id="getCipherService()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getCipherService</h4>
<pre class="methodSignature">public&nbsp;<a href="../crypto/CipherService.html" title="interface in org.apache.shiro.crypto">CipherService</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.138">getCipherService</a>()</pre>
<div class="block">Returns the <code>CipherService</code> to use for encrypting and decrypting serialized identity data to prevent easy
inspection of Subject identity data.
<p/>
Unless overridden by the <a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>setCipherService(org.apache.shiro.crypto.CipherService)</code></a> method, the default instance is an <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a>.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>Cipher</code> to use for encrypting and decrypting serialized identity data to prevent easy
inspection of Subject identity data</dd>
</dl>
</li>
</ul>
<a id="setCipherService(org.apache.shiro.crypto.CipherService)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setCipherService</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.161">setCipherService</a>&#8203;(<a href="../crypto/CipherService.html" title="interface in org.apache.shiro.crypto">CipherService</a>&nbsp;cipherService)</pre>
<div class="block">Sets the <code>CipherService</code> to use for encrypting and decrypting serialized identity data to prevent easy
inspection of Subject identity data.
<p/>
If the CipherService is a symmetric CipherService (using the same key for both encryption and decryption), you
should set your key via the <a href="#setCipherKey(byte%5B%5D)"><code>setCipherKey(byte[])</code></a> method.
<p/>
If the CipherService is an asymmetric CipherService (different keys for encryption and decryption, such as
public/private key pairs), you should set your encryption and decryption key via the respective
<a href="#setEncryptionCipherKey(byte%5B%5D)"><code>setEncryptionCipherKey(byte[])</code></a> and <a href="#setDecryptionCipherKey(byte%5B%5D)"><code>setDecryptionCipherKey(byte[])</code></a> methods.
<p/>
<b>N.B.</b> Unless overridden by this method, the default CipherService instance is an
<a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a>. This <code>RememberMeManager</code> implementation already has a configured symmetric key
to use for encryption and decryption, but it is recommended to provide your own for added security. See the
class-level JavaDoc for more information and why it might be good to provide your own.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cipherService</code> - the <code>CipherService</code> to use for encrypting and decrypting serialized identity data to
prevent easy inspection of Subject identity data.</dd>
</dl>
</li>
</ul>
<a id="getEncryptionCipherKey()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getEncryptionCipherKey</h4>
<pre class="methodSignature">public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.171">getEncryptionCipherKey</a>()</pre>
<div class="block">Returns the cipher key to use for encryption operations.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the cipher key to use for encryption operations.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>for a description of the various methods.</code></a></dd>
</dl>
</li>
</ul>
<a id="setEncryptionCipherKey(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setEncryptionCipherKey</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.181">setEncryptionCipherKey</a>&#8203;(byte[]&nbsp;encryptionCipherKey)</pre>
<div class="block">Sets the encryption key to use for encryption operations.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>encryptionCipherKey</code> - the encryption key to use for encryption operations.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>for a description of the various methods.</code></a></dd>
</dl>
</li>
</ul>
<a id="getDecryptionCipherKey()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getDecryptionCipherKey</h4>
<pre class="methodSignature">public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.191">getDecryptionCipherKey</a>()</pre>
<div class="block">Returns the decryption cipher key to use for decryption operations.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the cipher key to use for decryption operations.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>for a description of the various methods.</code></a></dd>
</dl>
</li>
</ul>
<a id="setDecryptionCipherKey(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setDecryptionCipherKey</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.201">setDecryptionCipherKey</a>&#8203;(byte[]&nbsp;decryptionCipherKey)</pre>
<div class="block">Sets the decryption key to use for decryption operations.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>decryptionCipherKey</code> - the decryption key to use for decryption operations.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="#setCipherService(org.apache.shiro.crypto.CipherService)"><code>for a description of the various methods.</code></a></dd>
</dl>
</li>
</ul>
<a id="getCipherKey()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getCipherKey</h4>
<pre class="methodSignature">public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.218">getCipherKey</a>()</pre>
<div class="block">Convenience method that returns the cipher key to use for <em>both</em> encryption and decryption.
<p/>
<b>N.B.</b> This method can only be called if the underlying <a href="#getCipherService()"><code>cipherService</code></a> is a symmetric
CipherService which by definition uses the same key for both encryption and decryption. If using an asymmetric
CipherService public/private key pair, you cannot use this method, and should instead use the
<a href="#getEncryptionCipherKey()"><code>getEncryptionCipherKey()</code></a> and <a href="#getDecryptionCipherKey()"><code>getDecryptionCipherKey()</code></a> methods individually.
<p/>
The default <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a> instance is a symmetric cipher service, so this method can be used if you are
using the default.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the symmetric cipher key used for both encryption and decryption.</dd>
</dl>
</li>
</ul>
<a id="setCipherKey(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setCipherKey</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.237">setCipherKey</a>&#8203;(byte[]&nbsp;cipherKey)</pre>
<div class="block">Convenience method that sets the cipher key to use for <em>both</em> encryption and decryption.
<p/>
<b>N.B.</b> This method can only be called if the underlying <a href="#getCipherService()"><code>cipherService</code></a> is a
symmetric CipherService?which by definition uses the same key for both encryption and decryption. If using an
asymmetric CipherService?(such as a public/private key pair), you cannot use this method, and should instead use
the <a href="#setEncryptionCipherKey(byte%5B%5D)"><code>setEncryptionCipherKey(byte[])</code></a> and <a href="#setDecryptionCipherKey(byte%5B%5D)"><code>setDecryptionCipherKey(byte[])</code></a> methods individually.
<p/>
The default <a href="../crypto/AesCipherService.html" title="class in org.apache.shiro.crypto"><code>AesCipherService</code></a> instance is a symmetric CipherService, so this method can be used if you
are using the default.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cipherKey</code> - the symmetric cipher key to use for both encryption and decryption.</dd>
</dl>
</li>
</ul>
<a id="forgetIdentity(org.apache.shiro.subject.Subject)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>forgetIdentity</h4>
<pre class="methodSignature">protected abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.250">forgetIdentity</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject)</pre>
<div class="block">Forgets (removes) any remembered identity data for the specified <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject instance for which identity data should be forgotten from the underlying persistence
mechanism.</dd>
</dl>
</li>
</ul>
<a id="isRememberMe(org.apache.shiro.authc.AuthenticationToken)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isRememberMe</h4>
<pre class="methodSignature">protected&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.265">isRememberMe</a>&#8203;(<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token)</pre>
<div class="block">Determines whether or not remember me services should be performed for the specified token. This method returns
<code>true</code> iff:
<ol>
<li>The token is not <code>null</code> and</li>
<li>The token is an <code>instanceof</code> <a href="../authc/RememberMeAuthenticationToken.html" title="interface in org.apache.shiro.authc"><code>RememberMeAuthenticationToken</code></a> and</li>
<li><code>token</code>.<a href="../authc/RememberMeAuthenticationToken.html#isRememberMe()"><code>isRememberMe()</code></a> is
<code>true</code></li>
</ol></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>token</code> - the authentication token submitted during the successful authentication attempt.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true if remember me services should be performed as a result of the successful authentication attempt.</dd>
</dl>
</li>
</ul>
<a id="onSuccessfulLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onSuccessfulLogin</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.281">onSuccessfulLogin</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;info)</pre>
<div class="block">Reacts to the successful login attempt by first always <a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgetting</code></a> any previously
stored identity. Then if the <code>token</code>
<a href="#isRememberMe(org.apache.shiro.authc.AuthenticationToken)"><code>is a RememberMe</code></a> token, the associated identity
will be <a href="#rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)"><code>remembered</code></a>
for later retrieval during a new user session.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="RememberMeManager.html#onSuccessfulLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)">onSuccessfulLogin</a></code>&nbsp;in interface&nbsp;<code><a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject for which the principals are being remembered.</dd>
<dd><code>token</code> - the token that resulted in a successful authentication attempt.</dd>
<dd><code>info</code> - the authentication info resulting from the successful authentication attempt.</dd>
</dl>
</li>
</ul>
<a id="rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationInfo)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>rememberIdentity</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.309">rememberIdentity</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;authcInfo)</pre>
<div class="block">Remembers a subject-unique identity for retrieval later. This implementation first
<a href="#getIdentityToRemember(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationInfo)"><code>resolves</code></a> the exact
<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>principals</code></a> to remember. It then remembers the principals by calling
<a href="#rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.subject.PrincipalCollection)"><code>rememberIdentity(org.apache.shiro.subject.Subject, org.apache.shiro.subject.PrincipalCollection)</code></a>.
<p/>
This implementation ignores the <a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc"><code>AuthenticationToken</code></a> argument, but it is available to subclasses if
necessary for custom logic.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject for which the principals are being remembered.</dd>
<dd><code>token</code> - the token that resulted in a successful authentication attempt.</dd>
<dd><code>authcInfo</code> - the authentication info resulting from the successful authentication attempt.</dd>
</dl>
</li>
</ul>
<a id="getIdentityToRemember(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationInfo)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getIdentityToRemember</h4>
<pre class="methodSignature">protected&nbsp;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.322">getIdentityToRemember</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationInfo.html" title="interface in org.apache.shiro.authc">AuthenticationInfo</a>&nbsp;info)</pre>
<div class="block">Returns <code>info</code>.<a href="../authc/AuthenticationInfo.html#getPrincipals()"><code>getPrincipals()</code></a> and
ignores the <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> argument.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject for which the principals are being remembered.</dd>
<dd><code>info</code> - the authentication info resulting from the successful authentication attempt.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>PrincipalCollection</code> to remember.</dd>
</dl>
</li>
</ul>
<a id="rememberIdentity(org.apache.shiro.subject.Subject,org.apache.shiro.subject.PrincipalCollection)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>rememberIdentity</h4>
<pre class="methodSignature">protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.335">rememberIdentity</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;accountPrincipals)</pre>
<div class="block">Remembers the specified account principals by first
<a href="#convertPrincipalsToBytes(org.apache.shiro.subject.PrincipalCollection)"><code>converting</code></a> them to a byte
array and then <a href="#rememberSerializedIdentity(org.apache.shiro.subject.Subject,byte%5B%5D)"><code>remembers</code></a> that
byte array.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject for which the principals are being remembered.</dd>
<dd><code>accountPrincipals</code> - the principals to remember for retrieval later.</dd>
</dl>
</li>
</ul>
<a id="convertPrincipalsToBytes(org.apache.shiro.subject.PrincipalCollection)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>convertPrincipalsToBytes</h4>
<pre class="methodSignature">protected&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.349">convertPrincipalsToBytes</a>&#8203;(<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;principals)</pre>
<div class="block">Converts the given principal collection the byte array that will be persisted to be 'remembered' later.
<p/>
This implementation first <a href="#serialize(org.apache.shiro.subject.PrincipalCollection)"><code>serializes</code></a> the
principals to a byte array and then <a href="#encrypt(byte%5B%5D)"><code>encrypts</code></a> that byte array.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>principals</code> - the <code>PrincipalCollection</code> to convert to a byte array</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the representative byte array to be persisted for remember me functionality.</dd>
</dl>
</li>
</ul>
<a id="rememberSerializedIdentity(org.apache.shiro.subject.Subject,byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>rememberSerializedIdentity</h4>
<pre class="methodSignature">protected abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.364">rememberSerializedIdentity</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
byte[]&nbsp;serialized)</pre>
<div class="block">Persists the identity bytes to a persistent store for retrieval later via the
<a href="#getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)"><code>getRememberedSerializedIdentity(SubjectContext)</code></a> method.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the Subject for which the identity is being serialized.</dd>
<dd><code>serialized</code> - the serialized bytes to be persisted.</dd>
</dl>
</li>
</ul>
<a id="getRememberedPrincipals(org.apache.shiro.subject.SubjectContext)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getRememberedPrincipals</h4>
<pre class="methodSignature">public&nbsp;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.380">getRememberedPrincipals</a>&#8203;(<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</pre>
<div class="block">Implements the interface method by first <a href="#getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)"><code>acquiring</code></a>
the remembered serialized byte array. Then it <a href="#convertBytesToPrincipals(byte%5B%5D,org.apache.shiro.subject.SubjectContext)"><code>converts</code></a>
them and returns the re-constituted <a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject"><code>PrincipalCollection</code></a>. If no remembered principals could be
obtained, <code>null</code> is returned.
<p/>
If any exceptions are thrown, the <a href="#onRememberedPrincipalFailure(java.lang.RuntimeException,org.apache.shiro.subject.SubjectContext)"><code>onRememberedPrincipalFailure(RuntimeException, SubjectContext)</code></a> method
is called to allow any necessary post-processing (such as immediately removing any previously remembered
values for safety).</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="RememberMeManager.html#getRememberedPrincipals(org.apache.shiro.subject.SubjectContext)">getRememberedPrincipals</a></code>&nbsp;in interface&nbsp;<code><a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subjectContext</code> - the contextual data, usually provided by a <a href="../subject/Subject.Builder.html" title="class in org.apache.shiro.subject"><code>Subject.Builder</code></a> implementation, that
is being used to construct a <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the remembered principals or <code>null</code> if none could be acquired.</dd>
</dl>
</li>
</ul>
<a id="getRememberedSerializedIdentity(org.apache.shiro.subject.SubjectContext)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getRememberedSerializedIdentity</h4>
<pre class="methodSignature">protected abstract&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.406">getRememberedSerializedIdentity</a>&#8203;(<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</pre>
<div class="block">Based on the given subject context data, retrieves the previously persisted serialized identity, or
<code>null</code> if there is no available data. The context map is usually populated by a <a href="../subject/Subject.Builder.html" title="class in org.apache.shiro.subject"><code>Subject.Builder</code></a>
implementation. See the <a href="SubjectFactory.html" title="interface in org.apache.shiro.mgt"><code>SubjectFactory</code></a> class constants for Shiro's known map keys.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subjectContext</code> - the contextual data, usually provided by a <a href="../subject/Subject.Builder.html" title="class in org.apache.shiro.subject"><code>Subject.Builder</code></a> implementation, that
is being used to construct a <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance. To be used to assist with data
lookup.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the previously persisted serialized identity, or <code>null</code> if there is no available data for the
Subject.</dd>
</dl>
</li>
</ul>
<a id="convertBytesToPrincipals(byte[],org.apache.shiro.subject.SubjectContext)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>convertBytesToPrincipals</h4>
<pre class="methodSignature">protected&nbsp;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.417">convertBytesToPrincipals</a>&#8203;(byte[]&nbsp;bytes,
<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;subjectContext)</pre>
<div class="block">If a <a href="#getCipherService()"><code>cipherService</code></a> is available, it will be used to first decrypt the byte array.
Then the bytes are then <a href="#deserialize(byte%5B%5D)"><code>deserialized</code></a> and then returned.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>bytes</code> - the bytes to decrypt if necessary and then deserialize.</dd>
<dd><code>subjectContext</code> - the contextual data, usually provided by a <a href="../subject/Subject.Builder.html" title="class in org.apache.shiro.subject"><code>Subject.Builder</code></a> implementation, that
is being used to construct a <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the de-serialized and possibly decrypted principals</dd>
</dl>
</li>
</ul>
<a id="onRememberedPrincipalFailure(java.lang.RuntimeException,org.apache.shiro.subject.SubjectContext)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onRememberedPrincipalFailure</h4>
<pre class="methodSignature">protected&nbsp;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.441">onRememberedPrincipalFailure</a>&#8203;(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang" class="externalLink">RuntimeException</a>&nbsp;e,
<a href="../subject/SubjectContext.html" title="interface in org.apache.shiro.subject">SubjectContext</a>&nbsp;context)</pre>
<div class="block">Called when an exception is thrown while trying to retrieve principals. The default implementation logs a
warning message and forgets ('unremembers') the problem identity by calling
<a href="RememberMeManager.html#forgetIdentity(org.apache.shiro.subject.SubjectContext)"><code>forgetIdentity(context)</code></a> and then immediately re-throws the
exception to allow the calling component to react accordingly.
<p/>
This method implementation never returns an
object - it always rethrows, but can be overridden by subclasses for custom handling behavior.
<p/>
This most commonly would be called when an encryption key is updated and old principals are retrieved that have
been encrypted with the previous key.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>e</code> - the exception that was thrown.</dd>
<dd><code>context</code> - the contextual data, usually provided by a <a href="../subject/Subject.Builder.html" title="class in org.apache.shiro.subject"><code>Subject.Builder</code></a> implementation, that
is being used to construct a <a href="../subject/Subject.html" title="interface in org.apache.shiro.subject"><code>Subject</code></a> instance.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>nothing - the original <code>RuntimeException</code> is propagated in all cases.</dd>
</dl>
</li>
</ul>
<a id="encrypt(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>encrypt</h4>
<pre class="methodSignature">protected&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.462">encrypt</a>&#8203;(byte[]&nbsp;serialized)</pre>
<div class="block">Encrypts the byte array by using the configured <a href="#getCipherService()"><code>cipherService</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>serialized</code> - the serialized object byte array to be encrypted</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>an encrypted byte array returned by the configured <a href="#getCipherService()"><code>() cipher</code></a>.</dd>
</dl>
</li>
</ul>
<a id="decrypt(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>decrypt</h4>
<pre class="methodSignature">protected&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.478">decrypt</a>&#8203;(byte[]&nbsp;encrypted)</pre>
<div class="block">Decrypts the byte array using the configured <a href="#getCipherService()"><code>cipherService</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>encrypted</code> - the encrypted byte array to decrypt</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the decrypted byte array returned by the configured <a href="#getCipherService()"><code>() cipher</code></a>.</dd>
</dl>
</li>
</ul>
<a id="serialize(org.apache.shiro.subject.PrincipalCollection)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>serialize</h4>
<pre class="methodSignature">protected&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.495">serialize</a>&#8203;(<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;principals)</pre>
<div class="block">Serializes the given <code>principals</code> by serializing them to a byte array by using the
<a href="#getSerializer()"><code>serializer</code></a>'s <a href="../io/Serializer.html#serialize(T)"><code>serialize</code></a> method.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>principals</code> - the principal collection to serialize to a byte array</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the serialized principal collection in the form of a byte array</dd>
</dl>
</li>
</ul>
<a id="deserialize(byte[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>deserialize</h4>
<pre class="methodSignature">protected&nbsp;<a href="../subject/PrincipalCollection.html" title="interface in org.apache.shiro.subject">PrincipalCollection</a>&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.506">deserialize</a>&#8203;(byte[]&nbsp;serializedIdentity)</pre>
<div class="block">De-serializes the given byte array by using the <a href="#getSerializer()"><code>serializer</code></a>'s
<a href="../io/Serializer.html#deserialize(byte%5B%5D)"><code>deserialize</code></a> method.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>serializedIdentity</code> - the previously serialized <code>PrincipalCollection</code> as a byte array</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the de-serialized (reconstituted) <code>PrincipalCollection</code></dd>
</dl>
</li>
</ul>
<a id="onFailedLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationException)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onFailedLogin</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.519">onFailedLogin</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject,
<a href="../authc/AuthenticationToken.html" title="interface in org.apache.shiro.authc">AuthenticationToken</a>&nbsp;token,
<a href="../authc/AuthenticationException.html" title="class in org.apache.shiro.authc">AuthenticationException</a>&nbsp;ae)</pre>
<div class="block">Reacts to a failed login by immediately <a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgetting</code></a> any
previously remembered identity. This is an additional security feature to prevent any remenant identity data
from being retained in case the authentication attempt is not being executed by the expected user.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="RememberMeManager.html#onFailedLogin(org.apache.shiro.subject.Subject,org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.authc.AuthenticationException)">onFailedLogin</a></code>&nbsp;in interface&nbsp;<code><a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject which executed the failed login attempt</dd>
<dd><code>token</code> - the authentication token resulting in a failed login attempt - ignored by this implementation</dd>
<dd><code>ae</code> - the exception thrown as a result of the failed login attempt - ignored by this implementation</dd>
</dl>
</li>
</ul>
<a id="onLogout(org.apache.shiro.subject.Subject)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>onLogout</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/shiro/mgt/AbstractRememberMeManager.html#line.529">onLogout</a>&#8203;(<a href="../subject/Subject.html" title="interface in org.apache.shiro.subject">Subject</a>&nbsp;subject)</pre>
<div class="block">Reacts to a subject logging out of the application and immediately
<a href="#forgetIdentity(org.apache.shiro.subject.Subject)"><code>forgets</code></a> any previously stored identity and returns.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="RememberMeManager.html#onLogout(org.apache.shiro.subject.Subject)">onLogout</a></code>&nbsp;in interface&nbsp;<code><a href="RememberMeManager.html" title="interface in org.apache.shiro.mgt">RememberMeManager</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>subject</code> - the subject logging out.</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/AbstractRememberMeManager.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 2004&#x2013;2020 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</body>
</html>