1. 程式人生 > >Shiro在Spring的會話管理(session)

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的配置將起作用。