RedisOperationsSessionRepsitory only deletes once

Previously RedisOperationsSessionRepository incorrectly:

* Deleted the session
* Added the session
* Set the expiration to be 0

This commit ensures that if the expiration is 0 that the sesson is only
deleted.

Fixes gh-292
This commit is contained in:
Rob Winch
2015-11-16 10:52:39 -06:00
parent 5fbf333c61
commit 8a5cba914b
2 changed files with 25 additions and 7 deletions

View File

@@ -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);
}

View File

@@ -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