diff --git a/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java b/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java index cd0e932..706c034 100644 --- a/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java +++ b/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java @@ -80,15 +80,23 @@ final class RedisSessionExpirationPolicy { } } + long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds(); + String sessionKey = getSessionKey(keyToExpire); + + if (sessionExpireInSeconds < 0) { + this.redis.boundValueOps(sessionKey).append(""); + this.redis.boundValueOps(sessionKey).persist(); + this.redis.boundHashOps(getSessionKey(session.getId())).persist(); + return; + } + String expireKey = getExpirationKey(toExpire); BoundSetOperations expireOperations = this.redis .boundSetOps(expireKey); expireOperations.add(keyToExpire); - long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds(); long fiveMinutesAfterExpires = sessionExpireInSeconds + TimeUnit.MINUTES.toSeconds(5); - String sessionKey = getSessionKey(keyToExpire); expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS); if (sessionExpireInSeconds == 0) { diff --git a/spring-session/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java b/spring-session/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java index 1014795..6c4c36e 100644 --- a/spring-session/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java +++ b/spring-session/src/test/java/org/springframework/session/data/redis/RedisSessionExpirationPolicyTests.java @@ -137,4 +137,36 @@ public class RedisSessionExpirationPolicyTests { verify(this.hashOperations).expire(this.session.getMaxInactiveIntervalInSeconds() + TimeUnit.MINUTES.toSeconds(5), TimeUnit.SECONDS); } + + @Test + public void onExpirationUpdatedDeleteOnZero() throws Exception { + String sessionKey = this.policy.getSessionKey("expires:" + this.session.getId()); + + long originalExpirationTimeInMs = ONE_MINUTE_AGO; + + this.session.setMaxInactiveIntervalInSeconds(0); + + this.policy.onExpirationUpdated(originalExpirationTimeInMs, this.session); + + // verify the original is removed + verify(this.setOperations).remove("expires:" + this.session.getId()); + verify(this.setOperations).add("expires:" + this.session.getId()); + verify(this.sessionRedisOperations).delete(sessionKey); + verify(this.setOperations).expire(this.session.getMaxInactiveIntervalInSeconds() + + TimeUnit.MINUTES.toSeconds(5), TimeUnit.SECONDS); + } + + @Test + public void onExpirationUpdatedPersistOnNegativeExpiration() throws Exception { + long originalExpirationTimeInMs = ONE_MINUTE_AGO; + + this.session.setMaxInactiveIntervalInSeconds(-1); + + this.policy.onExpirationUpdated(originalExpirationTimeInMs, this.session); + + verify(this.setOperations).remove("expires:" + this.session.getId()); + verify(this.valueOperations).append(""); + verify(this.valueOperations).persist(); + verify(this.hashOperations).persist(); + } }