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:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user