(四) Session管理 --《springboot與shiro整合》


登錄成功后使用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定時檢測是否過期

 

 
       


免責聲明!

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



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