spring项目中将sessionid对应的cookie过期时间设置很长,但是实际session还是在半个小时后失效,跟了一下代码,spring中session实现接口为
org.springframework.session.SessionRepository
public interface SessionRepository{ 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)