diff --git a/spring-web/src/main/java/org/springframework/web/server/session/InMemoryWebSessionStore.java b/spring-web/src/main/java/org/springframework/web/server/session/InMemoryWebSessionStore.java index 6e76d76e9c1..e76b133363e 100644 --- a/spring-web/src/main/java/org/springframework/web/server/session/InMemoryWebSessionStore.java +++ b/spring-web/src/main/java/org/springframework/web/server/session/InMemoryWebSessionStore.java @@ -280,7 +280,7 @@ public class InMemoryWebSessionStore implements WebSessionStore { private void checkMaxSessionsLimit() { if (sessions.size() >= maxSessions) { expiredSessionChecker.removeExpiredSessions(clock.instant()); - if (sessions.size() >= maxSessions) { + if (sessions.size() >= maxSessions && !sessions.containsKey(this.getId())) { throw new IllegalStateException("Max sessions limit reached: " + sessions.size()); } } diff --git a/spring-web/src/test/java/org/springframework/web/server/session/InMemoryWebSessionStoreTests.java b/spring-web/src/test/java/org/springframework/web/server/session/InMemoryWebSessionStoreTests.java index 7847cc3537c..baeac73d008 100644 --- a/spring-web/src/test/java/org/springframework/web/server/session/InMemoryWebSessionStoreTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/session/InMemoryWebSessionStoreTests.java @@ -23,6 +23,7 @@ import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import reactor.core.scheduler.Schedulers; +import reactor.test.StepVerifier; import org.springframework.beans.DirectFieldAccessor; import org.springframework.web.server.WebSession; @@ -157,6 +158,25 @@ class InMemoryWebSessionStoreTests { .withMessage("Max sessions limit reached: 10"); } + @Test + void updateSession() { + WebSession oneWebSession = insertSession(); + + StepVerifier.create(oneWebSession.save()) + .expectComplete() + .verify(); + } + + @Test + void updateSession_whenMaxSessionsReached() { + WebSession onceWebSession = insertSession(); + IntStream.range(1, 10000).forEach(i -> insertSession()); + + StepVerifier.create(onceWebSession.save()) + .expectComplete() + .verify(); + } + private WebSession insertSession() { WebSession session = this.store.createWebSession().block();