RedisOperations<String,ExpiringSession> -> RedisOperations<Object,Object>

The RedisOperations manages more than just ExpiringSessions, so we need
to make this more generice.

Fixes gh-259
This commit is contained in:
Rob Winch
2015-08-10 14:48:10 -05:00
parent 3ba07ec0a8
commit 690fbc8d3f
4 changed files with 23 additions and 28 deletions

View File

@@ -167,7 +167,7 @@ public class RedisOperationsSessionRepository implements SessionRepository<Redis
*/
static final String SESSION_ATTR_PREFIX = "sessionAttr:";
private final RedisOperations<String,ExpiringSession> sessionRedisOperations;
private final RedisOperations<Object,Object> sessionRedisOperations;
private final RedisSessionExpirationPolicy expirationPolicy;
@@ -181,7 +181,6 @@ public class RedisOperationsSessionRepository implements SessionRepository<Redis
*
* @param redisConnectionFactory the {@link RedisConnectionFactory} to use.
*/
@SuppressWarnings("unchecked")
public RedisOperationsSessionRepository(RedisConnectionFactory redisConnectionFactory) {
this(createDefaultTemplate(redisConnectionFactory));
}
@@ -191,7 +190,7 @@ public class RedisOperationsSessionRepository implements SessionRepository<Redis
*
* @param sessionRedisOperations The {@link RedisOperations} to use for managing the sessions. Cannot be null.
*/
public RedisOperationsSessionRepository(RedisOperations<String, ExpiringSession> sessionRedisOperations) {
public RedisOperationsSessionRepository(RedisOperations<Object, Object> sessionRedisOperations) {
Assert.notNull(sessionRedisOperations, "sessionRedisOperations cannot be null");
this.sessionRedisOperations = sessionRedisOperations;
this.expirationPolicy = new RedisSessionExpirationPolicy(sessionRedisOperations);
@@ -304,15 +303,14 @@ public class RedisOperationsSessionRepository implements SessionRepository<Redis
* @param sessionId the id of the {@link Session} to work with
* @return the {@link BoundHashOperations} to operate on a {@link Session}
*/
private BoundHashOperations<String, Object, Object> getSessionBoundHashOperations(String sessionId) {
private BoundHashOperations<Object, Object, Object> getSessionBoundHashOperations(String sessionId) {
String key = getKey(sessionId);
return this.sessionRedisOperations.boundHashOps(key);
}
@SuppressWarnings("rawtypes")
private static RedisTemplate createDefaultTemplate(RedisConnectionFactory connectionFactory) {
private static RedisTemplate<Object,Object> createDefaultTemplate(RedisConnectionFactory connectionFactory) {
Assert.notNull(connectionFactory,"connectionFactory cannot be null");
RedisTemplate<String, ExpiringSession> template = new RedisTemplate<String, ExpiringSession>();
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(connectionFactory);

View File

@@ -53,42 +53,38 @@ final class RedisSessionExpirationPolicy {
*/
static final String EXPIRATION_BOUNDED_HASH_KEY_PREFIX = "spring:session:expirations:";
private final RedisOperations<String,ExpiringSession> sessionRedisOperations;
private final RedisOperations<Object,Object> redis;
private final RedisOperations<String,String> expirationRedisOperations;
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisSessionExpirationPolicy(
RedisOperations sessionRedisOperations) {
RedisOperations<Object,Object> sessionRedisOperations) {
super();
this.sessionRedisOperations = sessionRedisOperations;
this.expirationRedisOperations = sessionRedisOperations;
this.redis = sessionRedisOperations;
}
public void onDelete(ExpiringSession session) {
long toExpire = roundUpToNextMinute(expiresInMillis(session));
String expireKey = getExpirationKey(toExpire);
expirationRedisOperations.boundSetOps(expireKey).remove(session.getId());
redis.boundSetOps(expireKey).remove(session.getId());
}
public void onExpirationUpdated(Long originalExpirationTimeInMilli, ExpiringSession session) {
if(originalExpirationTimeInMilli != null) {
long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli);
String expireKey = getExpirationKey(originalRoundedUp);
expirationRedisOperations.boundSetOps(expireKey).remove(session.getId());
redis.boundSetOps(expireKey).remove(expireKey);
}
long toExpire = roundUpToNextMinute(expiresInMillis(session));
String expireKey = getExpirationKey(toExpire);
BoundSetOperations<String, String> expireOperations = expirationRedisOperations.boundSetOps(expireKey);
BoundSetOperations<Object, Object> expireOperations = redis.boundSetOps(expireKey);
expireOperations.add(session.getId());
long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds();
String sessionKey = getSessionKey(session.getId());
expireOperations.expire(sessionExpireInSeconds + 60, TimeUnit.SECONDS);
sessionRedisOperations.boundHashOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS);
redis.boundHashOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS);
}
String getExpirationKey(long expires) {
@@ -108,10 +104,10 @@ final class RedisSessionExpirationPolicy {
}
String expirationKey = getExpirationKey(prevMin);
Set<String> sessionsToExpire = expirationRedisOperations.boundSetOps(expirationKey).members();
expirationRedisOperations.delete(expirationKey);
for(String session : sessionsToExpire) {
String sessionKey = getSessionKey(session);
Set<Object> sessionsToExpire = redis.boundSetOps(expirationKey).members();
redis.delete(expirationKey);
for(Object session : sessionsToExpire) {
String sessionKey = getSessionKey((String) session);
touch(sessionKey);
}
}
@@ -123,7 +119,7 @@ final class RedisSessionExpirationPolicy {
* @param key
*/
private void touch(String key) {
sessionRedisOperations.hasKey(key);
redis.hasKey(key);
}
static long expiresInMillis(ExpiringSession session) {

View File

@@ -88,8 +88,8 @@ public class RedisHttpSessionConfiguration implements ImportAware, BeanClassLoad
}
@Bean
public RedisTemplate<String,ExpiringSession> sessionRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, ExpiringSession> template = new RedisTemplate<String, ExpiringSession>();
public RedisTemplate<Object,Object> sessionRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(connectionFactory);
@@ -97,7 +97,7 @@ public class RedisHttpSessionConfiguration implements ImportAware, BeanClassLoad
}
@Bean
public RedisOperationsSessionRepository sessionRepository(RedisTemplate<String, ExpiringSession> sessionRedisTemplate) {
public RedisOperationsSessionRepository sessionRepository(@Qualifier("sessionRedisTemplate") RedisOperations<Object, Object> sessionRedisTemplate) {
RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(sessionRedisTemplate);
sessionRepository.setDefaultMaxInactiveInterval(maxInactiveIntervalInSeconds);
return sessionRepository;

View File

@@ -19,10 +19,12 @@ import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.ExpiringSession;
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
@@ -58,8 +60,7 @@ public class Gh109Tests {
*/
@Bean
@Override
public RedisOperationsSessionRepository sessionRepository(
RedisTemplate<String, ExpiringSession> sessionRedisTemplate) {
public RedisOperationsSessionRepository sessionRepository(RedisOperations<Object, Object> sessionRedisTemplate, ApplicationEventPublisher applicationEventPublisher) {
RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(
sessionRedisTemplate);
sessionRepository.setDefaultMaxInactiveInterval(sessionTimeout);