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

    
    
  • 相关阅读:
    使用RecyclerView打造Gallery
    Retrofit简介与使用方法(翻译)
    迷宫实现递归版本C++
    牛客笔试题
    牛客笔试题---求最长重复词长度之和
    C++句柄解析
    C++双向循环链表实现
    String C++完整实现。
    String写时拷贝实现
    顺序表操作补充(查找方法增加)
  • 原文地址:https://www.cnblogs.com/zls1218/p/8856347.html
Copyright © 2011-2022 走看看