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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM