From 1079e9e0167de110271ca048d29a23fcaa8e76a0 Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Tue, 4 Sep 2018 00:34:44 +0200 Subject: [PATCH] Ignore failed rename operation for deleted session Attempting to change session id for a deleted session currently results in "ERR no such key" error on rename operation of expired key. This commit addressed the problem by ignoring the aforementioned error. Closes #1177 --- .../RedisOperationsSessionRepositoryITests.java | 16 ++++++++++++++++ .../redis/RedisOperationsSessionRepository.java | 14 ++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) 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; }