Skip to content

Commit f3ec5da

Browse files
committed
Merge pull request #38703 from JohnNiang
* pr/38703: Support configuring maximum number of sessions for reactive server Closes gh-38703
2 parents d2a3c87 + 49c6bac commit f3ec5da

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ public static class Session {
329329
@DurationUnit(ChronoUnit.SECONDS)
330330
private Duration timeout = Duration.ofMinutes(30);
331331

332+
/**
333+
* The maximum number of sessions that can be stored.
334+
*/
335+
private int maxSessions = 10_000;
336+
332337
@NestedConfigurationProperty
333338
private final Cookie cookie = new Cookie();
334339

@@ -340,6 +345,14 @@ public void setTimeout(Duration timeout) {
340345
this.timeout = timeout;
341346
}
342347

348+
public int getMaxSessions() {
349+
return this.maxSessions;
350+
}
351+
352+
public void setMaxSessions(int maxSessions) {
353+
this.maxSessions = maxSessions;
354+
}
355+
343356
public Cookie getCookie() {
344357
return this.cookie;
345358
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,10 @@ public LocaleContextResolver localeContextResolver() {
332332
public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver) {
333333
DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
334334
Duration timeout = this.serverProperties.getReactive().getSession().getTimeout();
335-
webSessionManager.setSessionStore(new MaxIdleTimeInMemoryWebSessionStore(timeout));
335+
int maxSessions = this.serverProperties.getReactive().getSession().getMaxSessions();
336+
MaxIdleTimeInMemoryWebSessionStore sessionStore = new MaxIdleTimeInMemoryWebSessionStore(timeout);
337+
sessionStore.setMaxSessions(maxSessions);
338+
webSessionManager.setSessionStore(sessionStore);
336339
webSessionIdResolver.ifAvailable(webSessionManager::setSessionIdResolver);
337340
return webSessionManager;
338341
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,11 @@
109109
import org.springframework.web.server.i18n.FixedLocaleContextResolver;
110110
import org.springframework.web.server.i18n.LocaleContextResolver;
111111
import org.springframework.web.server.session.CookieWebSessionIdResolver;
112+
import org.springframework.web.server.session.DefaultWebSessionManager;
113+
import org.springframework.web.server.session.InMemoryWebSessionStore;
112114
import org.springframework.web.server.session.WebSessionIdResolver;
113115
import org.springframework.web.server.session.WebSessionManager;
116+
import org.springframework.web.server.session.WebSessionStore;
114117
import org.springframework.web.util.pattern.PathPattern;
115118

116119
import static org.assertj.core.api.Assertions.assertThat;
@@ -622,6 +625,20 @@ void customSessionTimeoutConfigurationShouldBeApplied() {
622625
})));
623626
}
624627

628+
@Test
629+
void customSessionMaxSessionsConfigurationShouldBeApplied() {
630+
this.contextRunner.withPropertyValues("server.reactive.session.max-sessions:123")
631+
.run((context) -> assertMaxSessionsWithWebSession(123));
632+
}
633+
634+
@Test
635+
void defaultSessionMaxSessionsConfigurationShouldBeInSync() {
636+
this.contextRunner.run((context) -> {
637+
int defaultMaxSessions = new InMemoryWebSessionStore().getMaxSessions();
638+
assertMaxSessionsWithWebSession(defaultMaxSessions);
639+
});
640+
}
641+
625642
@Test
626643
void customSessionCookieConfigurationShouldBeApplied() {
627644
this.contextRunner.withPropertyValues("server.reactive.session.cookie.name:JSESSIONID",
@@ -753,6 +770,16 @@ private ContextConsumer<ReactiveWebApplicationContext> assertSessionTimeoutWithW
753770
};
754771
}
755772

773+
private ContextConsumer<ReactiveWebApplicationContext> assertMaxSessionsWithWebSession(int maxSessions) {
774+
return (context) -> {
775+
WebSessionManager sessionManager = context.getBean(WebSessionManager.class);
776+
assertThat(sessionManager).isInstanceOf(DefaultWebSessionManager.class);
777+
WebSessionStore sessionStore = ((DefaultWebSessionManager) sessionManager).getSessionStore();
778+
assertThat(sessionStore).isInstanceOf(InMemoryWebSessionStore.class);
779+
assertThat(((InMemoryWebSessionStore) sessionStore).getMaxSessions()).isEqualTo(maxSessions);
780+
};
781+
}
782+
756783
private Map<PathPattern, Object> getHandlerMap(ApplicationContext context) {
757784
HandlerMapping mapping = context.getBean("resourceHandlerMapping", HandlerMapping.class);
758785
if (mapping instanceof SimpleUrlHandlerMapping simpleMapping) {

0 commit comments

Comments
 (0)