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) 

  • 相关阅读:
    正则工具
    反射工具类
    FastJson前置属性过滤器
    随机数工具类
    对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作
    ChineseNumber 转换
    auth src
    tex src
    freeradius防止用户异常断开无法重新链接上
    gnu
  • 原文地址:https://www.cnblogs.com/barneywill/p/11163735.html
Copyright © 2011-2022 走看看