大叔问题定位分享(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)
---------------------------------------------------------------- 结束啦,我是大魔王先生的分割线 :) ----------------------------------------------------------------
- 由于大魔王先生能力有限,文中可能存在错误,欢迎指正、补充!
- 感谢您的阅读,如果文章对您有用,那么请为大魔王先生轻轻点个赞,ありがとう