zoukankan      html  css  js  c++  java
  • Shiro的校验Session是否过期处理的过程

    首先开启定时扫描活跃的session进行校验

    <!-- shiro会话管理 -->
        <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 -->
        <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
            <property name="cacheManager" ref="redisCacheManager"/>
            <property name="sessionDAO" ref="redisSessionDAO"/>
            <property name="sessionIdCookie" ref="simpleCookie"/>
            <!-- 全局的会话信息时间,,单位为毫秒  -->
            <property name="globalSessionTimeout" value="60000"/>
            <!-- 检测扫描信息时间间隔,单位为毫秒-->
            <property name="sessionValidationInterval" value="60000"/>
            <!-- 是否开启扫描 -->
            <property name="sessionValidationSchedulerEnabled" value="true"/>
            <!-- 去掉URL中的JSESSIONID -->
            <property name="sessionIdUrlRewritingEnabled" value="false"/>
        </bean>

    然后看源代码

    AbstractValidatingSessionManager类中的validateSessions()

    public void validateSessions() {
            if (log.isInfoEnabled()) {
                log.info("Validating all active sessions...");
            }
    
            int invalidCount = 0;
    
            Collection<Session> activeSessions = getActiveSessions();
    
            if (activeSessions != null && !activeSessions.isEmpty()) {
                for (Session s : activeSessions) {
                    try {
                        //simulate a lookup key to satisfy the method signature.
                        //this could probably stand to be cleaned up in future versions:
                        SessionKey key = new DefaultSessionKey(s.getId());
                        validate(s, key);
                    } catch (InvalidSessionException e) {
                        if (log.isDebugEnabled()) {
                            boolean expired = (e instanceof ExpiredSessionException);
                            String msg = "Invalidated session with id [" + s.getId() + "]" +
                                    (expired ? " (expired)" : " (stopped)");
                            log.debug(msg);
                        }
                        invalidCount++;
                    }
                }
            }
    
            if (log.isInfoEnabled()) {
                String msg = "Finished session validation.";
                if (invalidCount > 0) {
                    msg += "  [" + invalidCount + "] sessions were stopped.";
                } else {
                    msg += "  No sessions were stopped.";
                }
                log.info(msg);
            }
        }

    做校验的方法是validate(s, key);

    protected void validate(Session session, SessionKey key) throws InvalidSessionException {
            try {
                doValidate(session);
            } catch (ExpiredSessionException ese) {
                onExpiration(session, ese, key);
                throw ese;
            } catch (InvalidSessionException ise) {
                onInvalidation(session, ise, key);
                throw ise;
            }
        }

    validate(session, key)说明:
    AbstractValidatingSessionManager.validate(Session session, SessionKey key)方法中,如果是session有效期过期了,这会调用onExpiration(Session s, ExpiredSessionException ese, SessionKey key)方法,该方法中onExpiration(s)调用ShiroCache类,删除shiro_redis_session:shiro-activeSessionCache:的session信息;afterExpired(s)调用RedisSessionDAO类,删除shiro_redis_session:的session信息

  • 相关阅读:
    Linux下几种文件传输命令 sz rz sftp scp
    jqGrid subGrid配置 如何首次加载动态展开所有的子表格
    MySQL使用规范
    Navicat连接MySQL报错2059
    微信小程序
    完美解决 ios10 及以上 Safari 无法禁止缩放的问题
    html5利用getObjectURL获取图片路径上传图片
    Vue的单页应用中如何引用单独的样式文件
    用JS添加和删除class类名
    APP中的 H5和原生页面如何分辨、何时使用
  • 原文地址:https://www.cnblogs.com/onlymate/p/9060533.html
Copyright © 2011-2022 走看看