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