zoukankan      html  css  js  c++  java
  • 【原创】大叔问题定位分享(35)spring中session失效时间

    spring项目中将sessionid对应的cookie过期时间设置很长,但是实际session还是在半个小时后失效,跟了一下代码,spring中session实现接口为

    org.springframework.session.SessionRepository

    public interface SessionRepository<S extends Session> {
        S createSession();
    
        void save(S var1);
    
        S findById(String var1);
    
        void deleteById(String var1);
    }

    这个接口有两个实现类:

    MapSessionRepository
    RedisOperationsSessionRepository

    单机环境使用前者,分布式环境使用后者,来看后者代码:

    org.springframework.session.data.redis.RedisOperationsSessionRepository

        public RedisOperationsSessionRepository.RedisSession createSession() {
            RedisOperationsSessionRepository.RedisSession redisSession = new RedisOperationsSessionRepository.RedisSession();
            if(this.defaultMaxInactiveInterval != null) {
                redisSession.setMaxInactiveInterval(Duration.ofSeconds((long)this.defaultMaxInactiveInterval.intValue()));
            }
    
            return redisSession;
        }

    org.springframework.session.data.redis.RedisOperationsSessionRepository.RedisSession

            RedisSession() {
                this(new MapSession());
                this.delta.put("creationTime", Long.valueOf(this.getCreationTime().toEpochMilli()));
                this.delta.put("maxInactiveInterval", Integer.valueOf((int)this.getMaxInactiveInterval().getSeconds()));
                this.delta.put("lastAccessedTime", Long.valueOf(this.getLastAccessedTime().toEpochMilli()));
                this.isNew = true;
                this.flushImmediateIfNecessary();
            }
    
            public boolean isExpired() {
                return this.cached.isExpired();
            }

    org.springframework.session.MapSession

        public boolean isExpired() {
            return this.isExpired(Instant.now());
        }
    
        boolean isExpired(Instant now) {
            return this.maxInactiveInterval.isNegative()?false:now.minus(this.maxInactiveInterval).compareTo(this.lastAccessedTime) >= 0;
        }

    可见是在创建session的时候设置两个时间,

    lastAccessedTime
    maxInactiveInterval

    如果 当前时间 - maxInactiveInterval > lastAccessedTime 就会认为session过期,设置的方法:

    @EnableRedisHttpSession(maxInactiveIntervalInSeconds=2000) 

  • 相关阅读:
    千氪公开课第一期|如何实现写作收益的最大化?-千氪
    2018年十大区块链投资机构盘点-千氪
    vscode 问题
    jquery点击输入框提示文字消失输入文字变色
    IE8兼容css3
    点击特定按钮,文本框实现输入状态变化
    h5页面在iOS上的问题解决
    纯css三角提示框,兼容IE8
    适配问题
    webstorm配置编译sass
  • 原文地址:https://www.cnblogs.com/barneywill/p/11163735.html
Copyright © 2011-2022 走看看