Shiro提供了完整的企業級會話管理功能,不依賴於底層容器(如Tomcat),不管是J2SE還是J2EE環境都可以使用,提供了會話管理,會話事件監聽,會話存儲/持久化,容器無關的集群,失效/過期支持,對Web的透明支持,SSO單點登錄的支持等特性。
建議在開發中,Controller層使用原生的HttpSession對象,在Service層中使用Shiro提供的Session對象。如果在Service層中使用HttpSession對象,那么屬於侵入式,並不建議這么做。Shiro提供的Session能夠很好的解決這個問題。
1,會話相關API
①Subject.getSession()
獲取會話,等價於Subject.getSession(true),即如果當前沒有創建session對象會創建一個;Subject.getSession(false),如果當前沒有創建session對象則返回null。
②Subject.getSession(true)
③session.getId()
獲取當前會話的唯一標識。
④session.getHost()
獲取當前會話的主機地址。
⑤session.getTimeout() & session.setTimeout(毫秒)
設置/獲取當前Session的過期時間。
⑥session.getStartTimestamp() & session.getLastAccessTime()
獲取會話的啟動時間及最后訪問時間;如果是J2SE環境需要自己定期調用session.touch()去更新最后訪問時間;如果是Web環境,每次進入ShiroFilter都會自動調用session.touch()來更新最后訪問時間。
⑦session.touch() & session.stop()
更新會話最后訪問時間以及銷毀會話;Subject.logout()會自動調用session.stop()。在Web應用中,調用HttpSession.invalidate()也會自動調用session.stop()來銷毀shiro的會話。
⑧session.setAttribute(key,val) & session.getAttribute(key) & session.removeAttribute(key)
設置/獲取/刪除 會話屬性。
2,會話監聽器(SessionListener接口)
①onStart(Session)
監聽會話創建事件
②onStop(Session)
監聽會話銷毀事件
③onExpiration(Session)
監聽會話過期事件
3,SessionDao
shiro提供SessionDao用於會話持久化。提供CRUD操作。


①AbstractSessionDAO 提供了 SessionDAO 的基礎實現,如生成會話ID等。
②CachingSessionDAO 提供了對開發者透明的會話緩存的功能,需要設置相應的 CacheManager。
③MemorySessionDAO 直接在內存中進行會話維護。
④EnterpriseCacheSessionDAO 提供了緩存功能的會話維護,默認情況下使用 MapCache 實現,內部使用 ConcurrentHashMap 保存緩存的會話。



在doCreate(Session)的時候,會獲取一個SessionId,SessoinId是由其屬性 sessionIdGenerator 來提供,所以在開發的時候需要配置sessionIdGenerator.
Shiro內部提供了兩個sessionIdGenerator實現類:

tips:在實際開發中,如果要用到SessionDAO組件,可以自定義類實現自EnterpriseCacheSessionDAO類,為其注入sessionIdGenerator屬性,如果用到緩存的話還可以注入一個緩存的名字。最后將這個SesionDAO組件注入給SessionManager(會話管理器),最后將SessionManager配置給SecurityManager。下圖是一個完整的配置細節。



4,會話驗證
①Shiro提供了會話驗證調度器,用於定期的驗證會話是否已過期,如果過期將停止會話。
②出於性能考慮,一般情況下都是獲取會話的同時來驗證會話是否過期並停止會話的;但是如果在Web環境中,如果用戶不主動退出是不知道會話是否過期的,因此需要定義的檢測會話是否過期,Shiro提供了會話驗證調度器來定期檢查會話是否過期,SessionValidationScheduler 。
③Shrio也提供了使用Quartz會話驗證調度器 QuartzSessionValidationScheduler 。