(四) 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定时检测是否过期

 


posted @ 2018-04-16 16:00  暖少年  阅读(4177)  评论(1编辑  收藏  举报