zoukankan      html  css  js  c++  java
  • (四) 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定时检测是否过期

    
    
  • 相关阅读:
    小白初学iOS中OTA部署(适应iOS7.1)
    CocoaPods管理本地库简单步骤
    CocoaPods问题记录
    UIPanGestureRecognizer下方法
    2013年度总结(反思篇)
    iOS7中cell的分割线右移的解决方法
    接触CocoaPods遇到的问题
    iOS摄像头问题
    iPhone4激活出错,菜鸟试验!!!!!
    详解UIPickerView
  • 原文地址:https://www.cnblogs.com/zls1218/p/8856347.html
Copyright © 2011-2022 走看看