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) 

  • 相关阅读:
    Html5页面返回机制解决方案
    Linux(Fedora)下NodeJs升级最新版本(制定版本)
    fedora23开发环境搭建手册
    fedora安装sublime text教程
    实现斐波那契数列之es5、es6
    选择城市下拉框中选择框右对齐,文本右对齐问题
    前端笔记(二)
    前端基础笔记(一)
    解决点击输入框弹出软键盘导致弹窗失效的问题
    angularJS之ng-bind与ng-bind-template的区别
  • 原文地址:https://www.cnblogs.com/barneywill/p/11163735.html
Copyright © 2011-2022 走看看