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 ab419181..8d8e1a44 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 @@ -85,8 +85,12 @@ final class RedisSessionExpirationPolicy { String sessionKey = getSessionKey(keyToExpire); expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS); - redis.boundValueOps(sessionKey).append(""); - redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS); + if(sessionExpireInSeconds == 0) { + redis.delete(sessionKey); + } else { + redis.boundValueOps(sessionKey).append(""); + redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS); + } redis.boundHashOps(getSessionKey(session.getId())).expire(fiveMinutesAfterExpires, TimeUnit.SECONDS); } diff --git a/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java b/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java index 8e6d6e04..9dbd0cc5 100644 --- a/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java +++ b/spring-session/src/test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryTests.java @@ -16,10 +16,8 @@ package org.springframework.session.data.redis; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.*; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.CREATION_TIME_ATTR; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.LAST_ACCESSED_ATTR; import static org.springframework.session.data.redis.RedisOperationsSessionRepository.MAX_INACTIVE_ATTR; @@ -215,6 +213,21 @@ public class RedisOperationsSessionRepositoryTests { assertThat(getDelta()).isEqualTo(map(getSessionAttrNameKey(attrName), null)); } + @Test + public void saveExpired() { + RedisSession session = redisRepository.new RedisSession(new MapSession()); + session.setMaxInactiveIntervalInSeconds(0); + when(redisOperations.boundHashOps(anyString())).thenReturn(boundHashOperations); + when(redisOperations.boundSetOps(anyString())).thenReturn(boundSetOperations); + when(redisOperations.boundValueOps(anyString())).thenReturn(boundValueOperations); + + redisRepository.save(session); + + String id = session.getId(); + verify(redisOperations,atLeastOnce()).delete(getKey("expires:"+id)); + verify(redisOperations,never()).boundValueOps(getKey("expires:"+id)); + } + @Test public void redisSessionGetAttributes() { String attrName = "attrName"; @@ -247,7 +260,8 @@ public class RedisOperationsSessionRepositoryTests { redisRepository.delete(id); assertThat(getDelta().get(MAX_INACTIVE_ATTR)).isEqualTo(0); - verify(redisOperations).delete(getKey("expires:"+id)); + verify(redisOperations,atLeastOnce()).delete(getKey("expires:"+id)); + verify(redisOperations,never()).boundValueOps(getKey("expires:"+id)); } @Test