shiro提供了完整的企業級會話還禮功能,不依賴與底層容器(如web容器Tomcat),不管JavaSE還是JavaEE環境都可以使用,提供了會話管理、會話事件監聽、會話存儲/持久化、容器無關的集群、失效/過期支持、對web的透明支持,SSO單點登錄的支持等特性。
一. 會話相關的API:org.apache.shiro.session.Session
1. Subject.getSession():獲取會話,其等價於Subject.getSession(true):如果當前沒有Session對象會創建一個;Subject.getSession(false):如果當前沒有Session則返回null。
2. 獲取當前會話的唯一ID:Serializable getId()
3. 獲取當前Subject的主機地址:String getHost()
4. 獲取/設置當前Session過期時間:
long getTimeout() throws InvalidSessionException void setTimeout(long maxIdleTimeInMillis) throws InvalidSessionException
5. 獲取Session的啟動時間/最后訪問時間:
如果是JavaSE應用需要自己定期調用session.touch()去更新最后訪問時間;如果是Web應用,每次進入ShiroFilter都會自動調用session.touch()來更新最后訪問時間。
Date getStartTimestamp()
Date getLastAccessTime()
6. 更新會話最后訪問時間以及銷毀會話;當Subject.logout()時會自動調用stop
void touch() throws InvalidSessionException void stop() throws InvalidSessionException
7. 設置/獲取/刪除會話屬性:
void setAttribute(Object key,Object value)throws InvalidSessionException Object getAttribute(Object key)throws InvalidSessionException Object removeAttribute(Object key)throws InvalidSessionException
二. 會話監聽器:org.apache.shiro.session.SessionListener
會話監聽器用於監聽會話創建、過期及停止
package org.apache.shiro.session; public interface SessionListener { void onStart(Session var1); void onStop(Session var1); void onExpiration(Session var1); }
三. SessionDAO:org.apache.shiro.session.mgt.eis.SessionDAO
AbstractSessionDAO 提供了SessionDAO 的基礎實現, 如生成會話ID等
CachingSessionDAO 提供了對開發者透明的會話緩存的功能,需要設置相應的 CacheManager
MemorySessionDAO 直接在內存中進行會話維護
EnterpriseCacheSessionDAO 提供了緩存功能的會話維護,默認情況下使用 MapCache 實現,內部使用ConcurrentHashMap 保存緩存的會話。
四. 會話驗證:
Shiro 提供了會話驗證調度器,用於定期的驗證會話是否已過期,如果過期將停止會話
出於性能考慮,一般情況下都是獲取會話時來驗證會話是否過期並停止會話的;但是如在 web 環境中,如果用戶不主動退出是不知道會話是否過期的,因此需要定期的檢測會話是否過期,Shiro 提供了會話驗證調度器SessionValidationScheduler
Shiro 也提供了使用Quartz會話驗證調度器:QuartzSessionValidationScheduler