diff --git a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryITests.java b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryITests.java index 2aa61fb6..c3e13e05 100644 --- a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryITests.java +++ b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/RedisOperationsSessionRepositoryITests.java @@ -581,6 +581,22 @@ public class RedisOperationsSessionRepositoryITests extends AbstractRedisITests assertThat(this.repository.findById(originalId)).isNull(); } + // gh-1137 + @Test + public void changeSessionIdWhenSessionIsDeleted() { + RedisSession toSave = this.repository.createSession(); + String sessionId = toSave.getId(); + this.repository.save(toSave); + + this.repository.deleteById(sessionId); + + toSave.changeSessionId(); + this.repository.save(toSave); + + assertThat(this.repository.findById(toSave.getId())).isNull(); + assertThat(this.repository.findById(sessionId)).isNull(); + } + private String getSecurityName() { return this.context.getAuthentication().getName(); } diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java index 4f4b7c23..63abfb32 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java @@ -28,6 +28,8 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.core.NestedExceptionUtils; +import org.springframework.dao.NonTransientDataAccessException; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.core.BoundHashOperations; @@ -814,8 +816,16 @@ public class RedisOperationsSessionRepository implements originalSessionIdKey, sessionIdKey); String originalExpiredKey = getExpiredKey(this.originalSessionId); String expiredKey = getExpiredKey(sessionId); - RedisOperationsSessionRepository.this.sessionRedisOperations.rename( - originalExpiredKey, expiredKey); + try { + RedisOperationsSessionRepository.this.sessionRedisOperations.rename( + originalExpiredKey, expiredKey); + } + catch (NonTransientDataAccessException ex) { + if (!"ERR no such key".equals(NestedExceptionUtils + .getMostSpecificCause(ex).getMessage())) { + throw ex; + } + } } this.originalSessionId = sessionId; }