diff --git a/spring-session-core/src/main/java/org/springframework/session/MapReactorSessionRepository.java b/spring-session-core/src/main/java/org/springframework/session/MapReactorSessionRepository.java index e13a50d3..ee9d1976 100644 --- a/spring-session-core/src/main/java/org/springframework/session/MapReactorSessionRepository.java +++ b/spring-session-core/src/main/java/org/springframework/session/MapReactorSessionRepository.java @@ -123,17 +123,10 @@ public class MapReactorSessionRepository implements ReactorSessionRepository findById(String id) { - return Mono.defer(() -> { - Session saved = this.sessions.get(id); - if (saved == null) { - return Mono.empty(); - } - if (saved.isExpired()) { - delete(saved.getId()); - return Mono.empty(); - } - return Mono.just(new MapSession(saved)); - }); + return Mono.defer(() -> Mono.justOrEmpty(this.sessions.get(id)) + .filter(session -> !session.isExpired()) + .map(MapSession::new) + .switchIfEmpty(delete(id).then(Mono.empty()))); } public Mono delete(String id) { diff --git a/spring-session-core/src/test/java/org/springframework/session/MapReactorSessionRepositoryTests.java b/spring-session-core/src/test/java/org/springframework/session/MapReactorSessionRepositoryTests.java index 22604f56..f7a0a0e2 100644 --- a/spring-session-core/src/test/java/org/springframework/session/MapReactorSessionRepositoryTests.java +++ b/spring-session-core/src/test/java/org/springframework/session/MapReactorSessionRepositoryTests.java @@ -22,6 +22,7 @@ import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.junit.Before; import org.junit.Test; @@ -33,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @since 2.0 */ public class MapReactorSessionRepositoryTests { + MapReactorSessionRepository repository; MapSession session; @@ -124,6 +126,19 @@ public class MapReactorSessionRepositoryTests { assertThat(this.repository.findById(this.session.getId()).block()).isNull(); } + @Test + public void findByIdWhenExpiredRemovesFromSessionMap() { + this.session.setMaxInactiveInterval(Duration.ofMinutes(1)); + this.session.setLastAccessedTime(Instant.now().minus(5, ChronoUnit.MINUTES)); + + Map sessions = new ConcurrentHashMap<>(); + sessions.put("session-id", this.session); + this.repository = new MapReactorSessionRepository(sessions); + + assertThat(this.repository.findById(this.session.getId()).block()).isNull(); + assertThat(sessions).isEmpty(); + } + @Test public void createSessionWhenDefaultMaxInactiveIntervalThenDefaultMaxInactiveInterval() { Session session = this.repository.createSession().block();