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

View File

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

View File

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

View File

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