Shiro在Spring的會話管理(session)

會話管理
在shiro裏面可以發現所有的用戶的會話信息都會由Shiro來進行控制,那麼也就是說只要是與用戶有關的一切的處理信息操作都可以通過Shiro取得,實際上可以取得的信息可以有用戶名、主機名稱等等,這所有的信息都可以通過Subject接口取得。

System.out.println("SESSION ID = " + SecurityUtils.getSubject().getSession().getId()); System.out.println("用戶名:" + SecurityUtils.getSubject().getPrincipal()); System.out.println("HOST:" + SecurityUtils.getSubject().getSession().getHost()); System.out.println("TIMEOUT :" + SecurityUtils.getSubject().getSession().getTimeout()); System.out.println("START:" + SecurityUtils.getSubject().getSession().getStartTimestamp()); System.out.println("LAST:" + SecurityUtils.getSubject().getSession().getLastAccessTime());

其中“getLastAccessTime()”這個方法表示該用戶的最後一次操作時間; 現在這些基礎的信息的確都取得了,可是這些都屬於Shiro中的默認配置,而用戶1、如果有需要也可以使用手工配置的模式完成。

<dependency> 
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-quartz</artifactId> 
</dependency>
<dependency> 
    <groupId>commons-collections</groupId> 
    <artifactId>commons-collections</artifactId>
     <version>3.2.2</version> 
</dependency>

如果要進行session管理,一定要定期釋放空間,所以這個時候一定需要定時組件纔可以完成。
2、 可以配置一個屬於自己的Session ID生成器:

<!-- 定義Session ID生成管理器 --> 
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />

3、 隨後需要定義有一個會話的DAO處理,指的是你的會話的緩存位置,本次暫時將所有的會話數據保存在內存裏面。
· 會話保存處理:org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO

<!-- 配置Session DAO的操作處理 --> 
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> 
    <!-- 設置session緩存的名字,這個名字可以任意 --> 
    <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> 
    <!-- 定義該Session DAO操作中所使用的ID生成器 --> 
    <property name="sessionIdGenerator" ref="sessionIdGenerator"/> 
</bean>

4、 現在只是定義了緩存所需要的組件,但是並沒有定義session與客戶端的之間的聯繫,爲了進行有效的session管理所以還需要建立有一個Cookie的操作模版。
· 處理Cookie:org.apache.shiro.web.servlet.SimpleCookie

<!-- 配置需要向Cookie中保存數據的配置模版 --> 
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 
    <!-- 在Tomcat運行下默認使用的Cookie的名字爲JSESSIONID --> <constructor-arg value="mldn-session-id"/> 
    <!-- 保證該系統不會受到跨域的腳本操作供給 --> 
    <property name="httpOnly" value="true"/> 
    <!-- 定義Cookie的過期時間,單位爲秒,如果設置爲-1表示瀏覽器關閉,則Cookie消失 --> 
    <property name="maxAge" value="-1"/> 
</bean>

5、 定義會話管理器(sessionManager)
· 操作類:org.apache.shiro.web.session.mgt.DefaultWebSessionManager;

<!-- 定義會話管理器的操作 -->
    <bean id="sessionManager"
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 定義的是全局的session會話超時時間,此操作會覆蓋web.xml文件中的超時時間配置 -->
        <property name="globalSessionTimeout" value="1000000"/>
        <!-- 刪除所有無效的Session對象,此時的session被保存在了內存裏面 -->
        <property name="deleteInvalidSessions" value="true"/>
        <!-- 定義要使用的無效的Session定時調度器 -->
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
        <!-- 需要讓此session可以使用該定時調度器進行檢測 -->
        <property name="sessionValidationSchedulerEnabled" value="true"/>
        <!-- 定義Session可以進行序列化的工具類 -->
        <property name="sessionDAO" ref="sessionDAO"/>
        <!-- 所有的session一定要將id設置到Cookie之中,需要提供有Cookie的操作模版 -->
        <property name="sessionIdCookie" ref="sessionIdCookie"/>
        <!-- 定義sessionIdCookie模版可以進行操作的啓用 -->
        <property name="sessionIdCookieEnabled" value="true"/>
    </bean> 

6、 所有的session一定要在用戶正確離開之後才能夠進行資源的釋放,但是用戶如果不點註銷,不能夠進行session的清空處理,所以爲了防止這樣的問題,還需要增加有一個會話的驗證調度器。
· 調度器程序類:org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler

<!-- 配置session的定時驗證檢測程序類,以讓無效的session釋放 -->
    <bean id="sessionValidationScheduler"
        class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
        <!-- 設置session的失效掃描間隔,單位爲毫秒 -->
        <property name="sessionValidationInterval" value="100000"/>
        <!-- 隨後還需要定義有一個會話管理器的程序類的引用 -->
        <property name="sessionManager" ref="sessionManager"/>
    </bean> 

7、 隨後需要修改安全管理器:

<!-- 配置SecurityManager的管理 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 配置你需要使用的Realms -->
        <property name="realm" ref="memberRealm"/>
        <property name="cacheManager" ref="cacheManager"/>
        <!-- 定義要使用的session管理器 -->
        <property name="sessionManager" ref="sessionManager"/>
    </bean>

此時就表示當前WEB開發中的所有的session的處理操作都交由Shiro來進行操作控制。
8、 另外的方法:
· 更新會話:SecurityUtils.getSubject().getSession().touch();
停止會話:SecurityUtils.getSubject().getSession().stop();
|-相當於WEB開發中的:session.invalidate()方法的執行;
|-註銷:SecurityUtils.getSubject().logout()。


Shiro對於Session管理有自己的實現機制,這些機制如果與WEB的操作重疊了,那麼Shiro的配置將起作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章