Skip to content

Commit 41e00e1

Browse files
committed
Merge pull request #26437 from weixsun
* pr/26437: Polish "Allow direct use of exposed WebSessionIdResolver bean" Allow direct use of exposed WebSessionIdResolver bean Closes gh-26437
2 parents c52eaba + fc0438e commit 41e00e1

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.web.reactive;
1818

1919
import java.time.Duration;
20+
import java.util.function.Supplier;
2021

2122
import org.apache.commons.logging.Log;
2223
import org.apache.commons.logging.LogFactory;
@@ -77,6 +78,7 @@
7778
import org.springframework.web.server.i18n.LocaleContextResolver;
7879
import org.springframework.web.server.session.CookieWebSessionIdResolver;
7980
import org.springframework.web.server.session.DefaultWebSessionManager;
81+
import org.springframework.web.server.session.WebSessionIdResolver;
8082
import org.springframework.web.server.session.WebSessionManager;
8183

8284
/**
@@ -307,15 +309,21 @@ public LocaleContextResolver localeContextResolver() {
307309

308310
@Bean
309311
@ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME)
310-
public WebSessionManager webSessionManager() {
312+
public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver) {
311313
DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
312-
CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver();
313-
webSessionIdResolver.addCookieInitializer((cookie) -> cookie
314-
.sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute()));
315-
webSessionManager.setSessionIdResolver(webSessionIdResolver);
314+
webSessionManager.setSessionIdResolver(webSessionIdResolver.getIfAvailable(cookieWebSessionIdResolver()));
316315
return webSessionManager;
317316
}
318317

318+
private Supplier<WebSessionIdResolver> cookieWebSessionIdResolver() {
319+
return () -> {
320+
CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver();
321+
webSessionIdResolver.addCookieInitializer((cookie) -> cookie
322+
.sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute()));
323+
return webSessionIdResolver;
324+
};
325+
}
326+
319327
}
320328

321329
@Configuration(proxyBeanMethods = false)

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

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Locale;
2929
import java.util.Map;
3030
import java.util.concurrent.TimeUnit;
31+
import java.util.function.Consumer;
3132

3233
import javax.validation.ValidatorFactory;
3334

@@ -40,8 +41,10 @@
4041
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
4142
import org.springframework.boot.autoconfigure.validation.ValidatorAdapter;
4243
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration.WebFluxConfig;
44+
import org.springframework.boot.test.context.runner.ContextConsumer;
4345
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
4446
import org.springframework.boot.web.codec.CodecCustomizer;
47+
import org.springframework.boot.web.reactive.context.ReactiveWebApplicationContext;
4548
import org.springframework.boot.web.reactive.filter.OrderedHiddenHttpMethodFilter;
4649
import org.springframework.context.ApplicationContext;
4750
import org.springframework.context.annotation.Bean;
@@ -87,6 +90,8 @@
8790
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
8891
import org.springframework.web.server.i18n.FixedLocaleContextResolver;
8992
import org.springframework.web.server.i18n.LocaleContextResolver;
93+
import org.springframework.web.server.session.CookieWebSessionIdResolver;
94+
import org.springframework.web.server.session.WebSessionIdResolver;
9095
import org.springframework.web.server.session.WebSessionManager;
9196
import org.springframework.web.util.pattern.PathPattern;
9297

@@ -563,17 +568,29 @@ void userConfigurersCanBeOrderedBeforeOrAfterTheAutoConfiguredConfigurer() {
563568
}
564569

565570
@Test
566-
void customSameSteConfigurationShouldBeApplied() {
567-
this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run((context) -> {
571+
void customWebSessionIdResolverShouldBeApplied() {
572+
this.contextRunner.withUserConfiguration(CustomWebSessionIdResolver.class).run(assertExchangeWithSession(
573+
(exchange) -> assertThat(exchange.getResponse().getCookies().get("TEST")).isNotEmpty()));
574+
}
575+
576+
@Test
577+
void customSameSiteConfigurationShouldBeApplied() {
578+
this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run(
579+
assertExchangeWithSession((exchange) -> assertThat(exchange.getResponse().getCookies().get("SESSION"))
580+
.isNotEmpty().allMatch((cookie) -> cookie.getSameSite().equals("Strict"))));
581+
}
582+
583+
private ContextConsumer<ReactiveWebApplicationContext> assertExchangeWithSession(
584+
Consumer<MockServerWebExchange> exchange) {
585+
return (context) -> {
568586
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
569-
MockServerWebExchange exchange = MockServerWebExchange.from(request);
587+
MockServerWebExchange webExchange = MockServerWebExchange.from(request);
570588
WebSessionManager webSessionManager = context.getBean(WebSessionManager.class);
571-
WebSession webSession = webSessionManager.getSession(exchange).block();
589+
WebSession webSession = webSessionManager.getSession(webExchange).block();
572590
webSession.start();
573-
exchange.getResponse().setComplete().block();
574-
assertThat(exchange.getResponse().getCookies().get("SESSION")).isNotEmpty()
575-
.allMatch((cookie) -> cookie.getSameSite().equals("Strict"));
576-
});
591+
webExchange.getResponse().setComplete().block();
592+
exchange.accept(webExchange);
593+
};
577594
}
578595

579596
private Map<PathPattern, Object> getHandlerMap(ApplicationContext context) {
@@ -584,6 +601,18 @@ private Map<PathPattern, Object> getHandlerMap(ApplicationContext context) {
584601
return Collections.emptyMap();
585602
}
586603

604+
@Configuration(proxyBeanMethods = false)
605+
static class CustomWebSessionIdResolver {
606+
607+
@Bean
608+
WebSessionIdResolver webSessionIdResolver() {
609+
CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
610+
resolver.setCookieName("TEST");
611+
return resolver;
612+
}
613+
614+
}
615+
587616
@Configuration(proxyBeanMethods = false)
588617
static class CustomArgumentResolvers {
589618

0 commit comments

Comments
 (0)