咏儿 發表於 2023-8-28 00:00:00

shiro会话管理示例代码

<p>
        shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管javase还是javaee环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对web的透明支持、sso单点登录的支持等特性。即直接使用shiro的会话管理可以直接替换如web容器的会话管理。 </p>
<p>
        <span><strong>会话</strong></span></p>
<p>
        所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。 </p>
<p>
        shiro的会话支持不仅可以在普通的javase应用中使用,也可以在javaee应用中使用,如web应用。且使用方式是一致的。 </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_357991">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">login(</code><code class="java string">"classpath:shiro.ini"</code><code class="java plain">, </code><code class="java string">"zhang"</code><code class="java plain">, </code><code class="java string">"123"</code><code class="java plain">); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">subject subject = securityutils.getsubject(); </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">session session = subject.getsession();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        登录成功后使用<code>subject.getsession()</code>即可获取会话;其等价于<code>subject.getsession(true)</code>,即如果当前没有创建session对象会创建一个;另外<code>subject.getsession(false)</code>,如果当前没有创建session则返回null(不过默认情况下如果启用会话存储功能的话在创建subject时会主动创建一个session)。</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_499843">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.getid();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        获取当前会话的唯一标识。 </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_588463">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.gethost();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
         获取当前subject的主机地址,该地址是通过hostauthenticationtoken.gethost()提供的。  </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_287106">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.gettimeout(); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">session.settimeout(毫秒);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        获取/设置当前session的过期时间;如果不设置默认是会话管理器的全局过期时间。  </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_226864">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.getstarttimestamp(); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">session.getlastaccesstime();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        获取会话的启动时间及最后访问时间;如果是javase应用需要自己定期调用session.touch()去更新最后访问时间;如果是web应用,每次进入shirofilter都会自动调用session.touch()来更新最后访问时间。     </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_41365">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.touch(); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">session.stop();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        更新会话最后访问时间及销毁会话;当subject.logout()时会自动调用stop方法来销毁会话。如果在web中,调用javax.servlet.http.httpsession. invalidate()也会自动调用shiro session.stop方法进行销毁shiro的会话。  </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_676329">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session.setattribute(</code><code class="java string">"key"</code><code class="java plain">, </code><code class="java string">"123"</code><code class="java plain">); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java keyword">assert</code><code class="java plain">.assertequals(</code><code class="java string">"123"</code><code class="java plain">, session.getattribute(</code><code class="java string">"key"</code><code class="java plain">)); </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">session.removeattribute(</code><code class="java string">"key"</code><code class="java plain">);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        设置/获取/删除会话属性;在整个会话范围内都可以对这些属性进行操作。  </p>
<p>
        shiro提供的会话可以用于javase/javaee环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块。 </p>
<p>
        <span><strong>会话管理器</strong></span></p>
<p>
        会话管理器管理着应用中所有subject的会话的创建、维护、删除、失效、验证等工作。是shiro的核心组件,顶层组件securitymanager直接继承了sessionmanager,且提供了sessionssecuritymanager实现直接把会话管理委托给相应的sessionmanager,defaultsecuritymanager及<br>
        defaultwebsecuritymanager默认securitymanager都继承了sessionssecuritymanager。 </p>
<p>
        securitymanager提供了如下接口: </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_945099">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">session start(sessioncontext context); </code><code class="java comments">//启动会话 </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">session getsession(sessionkey key) </code><code class="java keyword">throws</code> <code class="java plain">sessionexception; </code><code class="java comments">//根据会话key获取会话</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        另外用于web环境的websessionmanager又提供了如下接口: </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_797131">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">boolean</code> <code class="java plain">isservletcontainersessions();</code><code class="java comments">//是否使用servlet容器的会话</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        shiro还提供了validatingsessionmanager用于验资并过期会话: </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_240545">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">void</code> <code class="java plain">validatesessions();</code><code class="java comments">//验证所有会话是否过期</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="shiro会话管理示例代码" alt="shiro会话管理示例代码" id="theimg" src="https://zhuji.jb51.net/uploads/img/202305/30488a51afe434eda69f01cc6291d627.jpg" style='font-size: 12px; border-top: 0px; font-family: "microsoft yahei", simsun, arial, sans-serif; border-right: 0px; white-space: normal; word-spacing: 0px; border-bottom: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); padding-bottom: 0px; font-style: normal; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; orphans: 2; widows: 2; letter-spacing: normal; padding-right: 0px; background-color: rgb(255,255,255); text-indent: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px'></p>
<p>
        shiro提供了三个默认实现:</p>
<p>
        defaultsessionmanager:defaultsecuritymanager使用的默认实现,用于javase环境;<br>
        servletcontainersessionmanager:defaultwebsecuritymanager使用的默认实现,用于web环境,其直接使用servlet容器的会话;</p>
<p>
        defaultwebsessionmanager:用于web环境的实现,可以替代servletcontainersessionmanager,自己维护着会话,直接废弃了servlet容器的会话管理。</p>
<p>
        替换securitymanager默认的sessionmanager可以在ini中配置(shiro.ini):</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_592276">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain"> </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionmanager=org.apache.shiro.session.mgt.defaultsessionmanager </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">securitymanager.sessionmanager=$sessionmanager</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        web环境下的ini配置(shiro-web.ini):</p>
<p>
        &lt;!--endfragment--&gt;</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_959416">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain"> </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionmanager=org.apache.shiro.web.session.mgt.servletcontainersessionmanager </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">securitymanager.sessionmanager=$sessionmanager</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        另外可以设置会话的全局过期时间(毫秒为单位),默认30分钟:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_227333">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionmanager. globalsessiontimeout=</code><code class="java value">1800000</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        默认情况下globalsessiontimeout将应用给所有session。可以单独设置每个session的timeout属性来为每个session设置其超时时间。</p>
<p>
        另外如果使用servletcontainersessionmanager进行会话管理,session的超时依赖于底层servlet容器的超时时间,可以在web.xml中配置其会话的超时时间(分钟为单位): </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_999760">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">&lt;session-config&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;session-timeout&gt;</code><code class="java value">30</code><code class="java plain">&lt;/session-timeout&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">&lt;/session-config&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        在servlet容器中,默认使用jsessionid cookie维护会话,且会话默认是跟容器绑定的;在某些情况下可能需要使用自己的会话机制,此时我们可以使用defaultwebsessionmanager来维护会话:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_440590">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionidcookie=org.apache.shiro.web.servlet.simplecookie </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionmanager=org.apache.shiro.web.session.mgt.defaultwebsessionmanager </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">sessionidcookie.name=sid </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java plain">#sessionidcookie.domain=sishuok.com </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">#sessionidcookie.path= </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java plain">sessionidcookie.maxage=</code><code class="java value">1800</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java plain">sessionidcookie.httponly=</code><code class="java keyword">true</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java plain">sessionmanager.sessionidcookie=$sessionidcookie </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java plain">sessionmanager.sessionidcookieenabled=</code><code class="java keyword">true</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java plain">.securitymanager.sessionmanager=$sessionmanager</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        sessionidcookie是sessionmanager创建会话cookie的模板:</p>
<p>
        sessionidcookie.name:设置cookie名字,默认为jsessionid;</p>
<p>
        sessionidcookie.domain:设置cookie的域名,默认空,即当前访问的域名;</p>
<p>
        sessionidcookie.path:设置cookie的路径,默认空,即存储在域名根下;</p>
<p>
        sessionidcookie.maxage:设置cookie的过期时间,秒为单位,默认-1表示关闭浏览器时过期cookie;</p>
<p>
        sessionidcookie.httponly:如果设置为true,则客户端不会暴露给客户端脚本代码,使用httponly cookie有助于减少某些类型的跨站点脚本攻击;此特性需要实现了servlet 2.5 mr6及以上版本的规范的servlet容器支持;</p>
<p>
        sessionmanager.sessionidcookieenabled:是否启用/禁用session id cookie,默认是启用的;如果禁用后将不会设置session id cookie,即默认使用了servlet容器的jsessionid,且通过url重写(url中的“;jsessionid=id”部分)保存session id。</p>
<p>
         另外我们可以如“sessionmanager. sessionidcookie.name=sid”这种方式操作cookie模板。 </p>
<p>
        <span><strong>会话监听器</strong></span></p>
<p>
        会话监听器用于监听会话创建、过期及停止事件: </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_779770">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">mysessionlistener1 </code><code class="java keyword">implements</code> <code class="java plain">sessionlistener { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java color1">@override</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onstart(session session) {</code><code class="java comments">//会话创建时触发 </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">system.out.println(</code><code class="java string">"会话创建:"</code> <code class="java plain">+ session.getid()); </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces"> </code><code class="java color1">@override</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onexpiration(session session) {</code><code class="java comments">//会话过期时触发 </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">system.out.println(</code><code class="java string">"会话过期:"</code> <code class="java plain">+ session.getid()); </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces"> </code><code class="java color1">@override</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onstop(session session) {</code><code class="java comments">//退出/会话过期时触发 </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">system.out.println(</code><code class="java string">"会话停止:"</code> <code class="java plain">+ session.getid()); </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        如果只想监听某一个事件,可以继承sessionlisteneradapter实现:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_308063">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">mysessionlistener2 </code><code class="java keyword">extends</code> <code class="java plain">sessionlisteneradapter { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java color1">@override</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onstart(session session) { </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">system.out.println(</code><code class="java string">"会话创建:"</code> <code class="java plain">+ session.getid()); </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        在shiro-web.ini配置文件中可以进行如下配置设置会话监听器:</p>
<p>
        java代码 </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_612400">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionlistener1=com.github.zhangkaitao.shiro.chapter10.web.listener.mysessionlistener1 </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionlistener2=com.github.zhangkaitao.shiro.chapter10.web.listener.mysessionlistener2 </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">sessionmanager.sessionlisteners=$sessionlistener1,$sessionlistener2</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>会话存储/持久化 </strong></span></p>
<p>
        shiro提供sessiondao用于会话的crud,即dao(data access object)模式实现:</p>
<p>
        java代码 </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_915465">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java comments">//如defaultsessionmanager在创建完session后会调用该方法;如保存到关系数据库/文件系统/nosql数据库;即可以实现会话的持久化;返回会话id;主要此处返回的id.equals(session.getid()); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">serializable create(session session); </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java comments">//根据会话id获取会话 </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java plain">session readsession(serializable sessionid) </code><code class="java keyword">throws</code> <code class="java plain">unknownsessionexception; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java comments">//更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用 </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java keyword">void</code> <code class="java plain">update(session session) </code><code class="java keyword">throws</code> <code class="java plain">unknownsessionexception; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java comments">//删除会话;当会话过期/会话停止(如用户退出时)会调用 </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java keyword">void</code> <code class="java plain">delete(session session); </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java comments">//获取当前所有活跃用户,如果用户量多此方法影响性能 </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java plain">collection&lt;session&gt; getactivesessions();</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        shiro内嵌了如下sessiondao实现:</p>
<p>
        <img title="shiro会话管理示例代码" alt="shiro会话管理示例代码" id="theimg" src="https://zhuji.jb51.net/uploads/img/202305/9a05ea75aca37e239dca9a3d07363f80.jpg" style='font-size: 12px; border-top: 0px; font-family: "microsoft yahei", simsun, arial, sans-serif; border-right: 0px; white-space: normal; word-spacing: 0px; border-bottom: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); padding-bottom: 0px; font-style: normal; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; orphans: 2; widows: 2; letter-spacing: normal; padding-right: 0px; background-color: rgb(255,255,255); text-indent: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px'></p>
<p>
        abstractsessiondao提供了sessiondao的基础实现,如生成会话id等;cachingsessiondao提供了对开发者透明的会话缓存的功能,只需要设置相应的cachemanager即可;memorysessiondao直接在内存中进行会话维护;而enterprisecachesessiondao提供了缓存功能的会话维护,默认情况下使用mapcache实现,内部使用concurrenthashmap保存缓存的会话。</p>
<p>
        可以通过如下配置设置sessiondao:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_274292">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessiondao=org.apache.shiro.session.mgt.eis.enterprisecachesessiondao </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionmanager.sessiondao=$sessiondao</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        shiro提供了使用ehcache进行会话存储,ehcache可以配合terracotta实现容器无关的分布式集群。</p>
<p>
        首先在pom.xml里添加如下依赖:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_284298">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">&lt;dependency&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;groupid&gt;org.apache.shiro&lt;/groupid&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;artifactid&gt;shiro-ehcache&lt;/artifactid&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;version&gt;</code><code class="java value">1.2</code><code class="java plain">.</code><code class="java value">2</code><code class="java plain">&lt;/version&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">&lt;/dependency&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        接着配置shiro-web.ini文件:   </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_267727">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessiondao=org.apache.shiro.session.mgt.eis.enterprisecachesessiondao </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessiondao. activesessionscachename=shiro-activesessioncache </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">sessionmanager.sessiondao=$sessiondao </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java plain">cachemanager = org.apache.shiro.cache.ehcache.ehcachemanager </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">cachemanager.cachemanagerconfigfile=classpath:ehcache.xml </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java plain">securitymanager.cachemanager = $cachemanager</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        sessiondao. activesessionscachename:设置session缓存名字,默认就是shiro-activesessioncache;</p>
<p>
        cachemanager:缓存管理器,用于管理缓存的,此处使用ehcache实现;</p>
<p>
        cachemanager.cachemanagerconfigfile:设置ehcache缓存的配置文件;</p>
<p>
        securitymanager.cachemanager:设置securitymanager的cachemanager,会自动设置实现了cachemanageraware接口的相应对象,如sessiondao的cachemanager;</p>
<p>
        然后配置ehcache.xml:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_486487">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">&lt;cache name=</code><code class="java string">"shiro-activesessioncache"</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">maxentrieslocalheap=</code><code class="java string">"10000"</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">overflowtodisk=</code><code class="java string">"false"</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">eternal=</code><code class="java string">"false"</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">diskpersistent=</code><code class="java string">"false"</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">timetoliveseconds=</code><code class="java string">"0"</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">timetoidleseconds=</code><code class="java string">"0"</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">statistics=</code><code class="java string">"true"</code><code class="java plain">/&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        cache的名字为shiro-activesessioncache,即设置的sessiondao的activesessionscachename属性值。 </p>
<p>
        另外可以通过如下ini配置设置会话id生成器:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_384164">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionidgenerator=org.apache.shiro.session.mgt.eis.javauuidsessionidgenerator </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessiondao.sessionidgenerator=$sessionidgenerator</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        用于生成会话id,默认就是javauuidsessionidgenerator,使用java.util.uuid生成。 </p>
<p>
        如果自定义实现sessiondao,继承cachingsessiondao即可:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_309334">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">mysessiondao </code><code class="java keyword">extends</code> <code class="java plain">cachingsessiondao { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">jdbctemplate jdbctemplate = jdbctemplateutils.jdbctemplate(); </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">protected</code> <code class="java plain">serializable docreate(session session) { </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">serializable sessionid = generatesessionid(session); </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">assignsessionid(session, sessionid); </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">string sql = </code><code class="java string">"insert into sessions(id, session) values(?,?)"</code><code class="java plain">; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">jdbctemplate.update(sql, sessionid, serializableutils.serialize(session)); </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">session.getid(); </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">doupdate(session session) { </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">if</code><code class="java plain">(session </code><code class="java keyword">instanceof</code> <code class="java plain">validatingsession &amp;&amp; !((validatingsession)session).isvalid()) { </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code><code class="java plain">; </code><code class="java comments">//如果会话过期/停止 没必要再更新了 </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">string sql = </code><code class="java string">"update sessions set session=? where id=?"</code><code class="java plain">; </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">jdbctemplate.update(sql, serializableutils.serialize(session), session.getid()); </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">dodelete(session session) { </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">string sql = </code><code class="java string">"delete from sessions where id=?"</code><code class="java plain">; </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">jdbctemplate.update(sql, session.getid()); </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">protected</code> <code class="java plain">session doreadsession(serializable sessionid) { </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">string sql = </code><code class="java string">"select session from sessions where id=?"</code><code class="java plain">; </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">list&lt;string&gt; sessionstrlist = jdbctemplate.queryforlist(sql, string.</code><code class="java keyword">class</code><code class="java plain">, sessionid); </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">if</code><code class="java plain">(sessionstrlist.size() == </code><code class="java value">0</code><code class="java plain">) </code><code class="java keyword">return</code> <code class="java keyword">null</code><code class="java plain">; </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">serializableutils.deserialize(sessionstrlist.get(</code><code class="java value">0</code><code class="java plain">)); </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        docreate/doupdate/dodelete/doreadsession分别代表创建/修改/删除/读取会话;此处通过把会话序列化后存储到数据库实现;接着在shiro-web.ini中配置:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_946041">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessiondao=com.github.zhangkaitao.shiro.chapter10.session.dao.mysessiondao</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        其他设置和之前一样,因为继承了cachingsessiondao;所有在读取时会先查缓存中是否存在,如果找不到才到数据库中查找。 </p>
<p>
        <span><strong>会话验证</strong></span></p>
<p>
        shiro提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,shiro提供了会话验证调度器sessionvalidationscheduler来做这件事情。</p>
<p>
        可以通过如下ini配置开启会话验证:   </p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_890517">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionvalidationscheduler=org.apache.shiro.session.mgt.executorservicesessionvalidationscheduler </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionvalidationscheduler.interval = </code><code class="java value">3600000</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">sessionvalidationscheduler.sessionmanager=$sessionmanager </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java plain">sessionmanager.globalsessiontimeout=</code><code class="java value">1800000</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">sessionmanager.sessionvalidationschedulerenabled=</code><code class="java keyword">true</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java plain">sessionmanager.sessionvalidationscheduler=$sessionvalidationscheduler</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        sessionvalidationscheduler:会话验证调度器,sessionmanager默认就是使用executorservicesessionvalidationscheduler,其使用jdk的scheduledexecutorservice进行定期调度并验证会话是否过期;</p>
<p>
        sessionvalidationscheduler.interval:设置调度时间间隔,单位毫秒,默认就是1小时;</p>
<p>
        sessionvalidationscheduler.sessionmanager:设置会话验证调度器进行会话验证时的会话管理器;</p>
<p>
        sessionmanager.globalsessiontimeout:设置全局会话超时时间,默认30分钟,即如果30分钟内没有访问会话将过期;</p>
<p>
        sessionmanager.sessionvalidationschedulerenabled:是否开启会话验证器,默认是开启的;</p>
<p>
        sessionmanager.sessionvalidationscheduler:设置会话验证调度器,默认就是使用executorservicesessionvalidationscheduler。 </p>
<p>
        shiro也提供了使用quartz会话验证调度器:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_973727">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionvalidationscheduler=org.apache.shiro.session.mgt.quartz.quartzsessionvalidationscheduler </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionvalidationscheduler.sessionvalidationinterval = </code><code class="java value">3600000</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">sessionvalidationscheduler.sessionmanager=$sessionmanager</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        使用时需要导入shiro-quartz依赖:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_893057">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">&lt;dependency&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">&lt;groupid&gt;org.apache.shiro&lt;/groupid&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">&lt;artifactid&gt;shiro-quartz&lt;/artifactid&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">&lt;version&gt;</code><code class="java value">1.2</code><code class="java plain">.</code><code class="java value">2</code><code class="java plain">&lt;/version&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">&lt;/dependency&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        如上会话验证调度器实现都是直接调用abstractvalidatingsessionmanager 的validatesessions方法进行验证,其直接调用sessiondao的getactivesessions方法获取所有会话进行验证,如果会话比较多,会影响性能;可以考虑如分页获取会话并进行验证,如com.github.zhangkaitao.shiro.chapter10.session.scheduler.mysessionvalidationscheduler:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_400572">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java comments">//分页获取会话并验证 </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">string sql = </code><code class="java string">"select session from sessions limit ?,?"</code><code class="java plain">; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java keyword">int</code> <code class="java plain">start = </code><code class="java value">0</code><code class="java plain">; </code><code class="java comments">//起始记录 </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java keyword">int</code> <code class="java plain">size = </code><code class="java value">20</code><code class="java plain">; </code><code class="java comments">//每页大小 </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java plain">list&lt;string&gt; sessionlist = jdbctemplate.queryforlist(sql, string.</code><code class="java keyword">class</code><code class="java plain">, start, size); </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java keyword">while</code><code class="java plain">(sessionlist.size() &gt; </code><code class="java value">0</code><code class="java plain">) { </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">for</code><code class="java plain">(string sessionstr : sessionlist) { </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">try</code> <code class="java plain">{ </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">session session = serializableutils.deserialize(sessionstr); </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">method validatemethod = </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">reflectionutils.findmethod(abstractvalidatingsessionmanager.</code><code class="java keyword">class</code><code class="java plain">, </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">   </code><code class="java string">"validate"</code><code class="java plain">, session.</code><code class="java keyword">class</code><code class="java plain">, sessionkey.</code><code class="java keyword">class</code><code class="java plain">); </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">validatemethod.setaccessible(</code><code class="java keyword">true</code><code class="java plain">); </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">reflectionutils.invokemethod(validatemethod, </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">sessionmanager, session, </code><code class="java keyword">new</code> <code class="java plain">defaultsessionkey(session.getid())); </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code><code class="java keyword">catch</code> <code class="java plain">(exception e) { </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces">  </code><code class="java comments">//ignore </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">start = start + size; </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">sessionlist = jdbctemplate.queryforlist(sql, string.</code><code class="java keyword">class</code><code class="java plain">, start, size); </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        其直接改造自executorservicesessionvalidationscheduler,如上代码是验证的核心代码,可以根据自己的需求改造此验证调度器器;ini的配置和之前的类似。</p>
<p>
        如果在会话过期时不想删除过期的会话,可以通过如下ini配置进行设置:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_854602">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionmanager.deleteinvalidsessions=</code><code class="java keyword">false</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        默认是开启的,在会话过期后会调用sessiondao的delete方法删除会话:如会话时持久化存储的,可以调用此方法进行删除。 </p>
<p>
        如果是在获取会话时验证了会话已过期,将抛出invalidsessionexception;因此需要捕获这个异常并跳转到相应的页面告诉用户会话已过期,让其重新登录,如可以在web.xml配置相应的错误页面:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_992035">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">&lt;error-page&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;exception-type&gt;org.apache.shiro.session.invalidsessionexception&lt;/exception-type&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">&lt;location&gt;/invalidsession.jsp&lt;/location&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java plain">&lt;/error-page&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>sessionfactory</strong></span></p>
<p>
        sessionfactory是创建会话的工厂,根据相应的subject上下文信息来创建会话;默认提供了simplesessionfactory用来创建simplesession会话。</p>
<p>
        首先自定义一个session:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_905241">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">onlinesession </code><code class="java keyword">extends</code> <code class="java plain">simplesession { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java keyword">enum</code> <code class="java plain">onlinestatus { </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">on_line(</code><code class="java string">"在线"</code><code class="java plain">), hidden(</code><code class="java string">"隐身"</code><code class="java plain">), force_logout(</code><code class="java string">"强制退出"</code><code class="java plain">); </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">private</code> <code class="java keyword">final</code> <code class="java plain">string info; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">private</code> <code class="java plain">onlinestatus(string info) { </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces">   </code><code class="java keyword">this</code><code class="java plain">.info = info; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">} </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">public</code> <code class="java plain">string getinfo() { </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces">   </code><code class="java keyword">return</code> <code class="java plain">info; </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">} </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">string useragent; </code><code class="java comments">//用户浏览器类型 </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">onlinestatus status = onlinestatus.on_line; </code><code class="java comments">//在线状态 </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">string systemhost; </code><code class="java comments">//用户登录时系统ip </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces"> </code><code class="java comments">//省略其他 </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        onlinesession用于保存当前登录用户的在线状态,支持如离线等状态的控制。</p>
<p>
        接着自定义sessionfactory:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_726533">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">onlinesessionfactory </code><code class="java keyword">implements</code> <code class="java plain">sessionfactory { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java spaces"> </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java color1">@override</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">session createsession(sessioncontext initdata) { </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">onlinesession session = </code><code class="java keyword">new</code> <code class="java plain">onlinesession(); </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">if</code> <code class="java plain">(initdata != </code><code class="java keyword">null</code> <code class="java plain">&amp;&amp; initdata </code><code class="java keyword">instanceof</code> <code class="java plain">websessioncontext) { </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces">   </code><code class="java plain">websessioncontext sessioncontext = (websessioncontext) initdata; </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">   </code><code class="java plain">httpservletrequest request = (httpservletrequest) sessioncontext.getservletrequest(); </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces">   </code><code class="java keyword">if</code> <code class="java plain">(request != </code><code class="java keyword">null</code><code class="java plain">) { </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces">    </code><code class="java plain">session.sethost(iputils.getipaddr(request)); </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces">    </code><code class="java plain">session.setuseragent(request.getheader(</code><code class="java string">"user-agent"</code><code class="java plain">)); </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">    </code><code class="java plain">session.setsystemhost(request.getlocaladdr() + </code><code class="java string">":"</code> <code class="java plain">+ request.getlocalport()); </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">   </code><code class="java plain">} </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">} </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">session; </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">} </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        根据会话上下文创建相应的onlinesession。 </p>
<p>
        最后在shiro-web.ini配置文件中配置:</p>
<p>
        java代码  </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_696652">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java plain">sessionfactory=org.apache.shiro.session.mgt.onlinesessionfactory </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">sessionmanager.sessionfactory=$sessionfactory</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong> 总结</strong></span></p>
<p>
        以上所述是小编给大家介绍的shiro会话管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!</p>
<p>
        原文链接:http://blog.sina.com.cn/s/blog_9c6852670102wwb6.html</p>
頁: [1]
查看完整版本: shiro会话管理示例代码