登錄成功后使用Subject.getSession()即可獲取會話;其等價於Subject.getSession(true),即如果當前沒有創建Session對象會創建一個;
另外Subject.getSession(false),如果當前沒有創建Session則返回null(不過默認情況下如果啟用會話存儲功能的話在創建Subject時會主動創建一個Session)。
JAVA代碼
session.getId();
獲取session唯一id
session.getHost();
獲取當前Subject的主機地址,該地址是通過HostAuthenticationToken.getHost()提供的。
session.getTimeout();
session.setTimeout(毫秒);
獲取/設置當前Session的過期時間;
session.getStartTimestamp();
session.getLastAccessTime();
獲取會話的啟動時間及最后訪問時間
會話管理器
會話管理器管理着應用中所有Subject的會話的創建、維護、刪除、失效、驗證等工作。是Shiro的核心組件,頂層組件SecurityManager直接繼承了SessionManager,且提供了SessionsSecurityManager實現直接把會話管理委托給相應的SessionManager,DefaultSecurityManager及DefaultWebSecurityManager默認SecurityManager都繼承了SessionsSecurityManager。
1.自定義SessionDao 持久化session 相關信息
@Component public class ShiroSessionDao extends CachingSessionDAO { @Autowired private SessionDao sessionDao; @Override public Serializable doCreate(Session session) { ShiroSession ss = new ShiroSession(); Serializable sessionId = generateSessionId(session); assignSessionId(session, sessionId); ss.setSession(sessionId.toString()); ss.setHost(session.getHost()); sessionDao.createSession(ss); return sessionId; } @Override public void doDelete(Session session) { Serializable sessionId = session.getId(); sessionDao.deleteSession(sessionId.toString()); } @Override protected Session doReadSession(Serializable sessionId) { return super.getCachedSession(sessionId); } @Override protected void doUpdate(Session session) { } }
2.配置SessionManager
//配置設置會話ID生成器, @Bean public JavaUuidSessionIdGenerator sessionIdGenerator(){ return new JavaUuidSessionIdGenerator(); } @Bean public SessionDAO getSessionDao(){ ShiroSessionDao sessionDao = new ShiroSessionDao(); sessionDao.setSessionIdGenerator(sessionIdGenerator()); return sessionDao; } @Bean public SessionManager sessionManager(){ SessionManager sessionManager = new SessionManager(); ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler(); scheduler.setInterval(180000); scheduler.setSessionManager(sessionManager); sessionManager.setGlobalSessionTimeout(180000); sessionManager.setSessionValidationScheduler(scheduler); sessionManager.setSessionDAO(getSessionDao()); return sessionManager; } @Bean public EhCacheManager cacheManager(){ EhCacheManager cache = new EhCacheManager(); cache.setCacheManagerConfigFile("classpath:ehcache.xml"); return cache; }
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myShiroRealm());
securityManager.setSessionManager(sessionManager());
securityManager.setCacheManager(cacheManager());
return securityManager;
}
ExecutorServiceSessionValidationScheduler:會話驗證調度器,定時檢測會話是否過期
現在用戶會話都會保存到數據庫中,由ExecutorServiceSessionValidationScheduler定時檢測是否過期

