From 65ce1454e003c4f77ee527040e2251eefe0bd7ad Mon Sep 17 00:00:00 2001 From: weixsun Date: Wed, 12 May 2021 15:56:06 +0800 Subject: [PATCH 1/2] Allow direct use of exposed WebSessionIdResolver bean See gh-26437 --- .../reactive/WebFluxAutoConfiguration.java | 13 ++++++--- .../WebFluxAutoConfigurationTests.java | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index b1e6969ee76..fc24a762747 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -77,6 +77,7 @@ import org.springframework.web.server.i18n.FixedLocaleContextResolver; import org.springframework.web.server.i18n.LocaleContextResolver; import org.springframework.web.server.session.CookieWebSessionIdResolver; import org.springframework.web.server.session.DefaultWebSessionManager; +import org.springframework.web.server.session.WebSessionIdResolver; import org.springframework.web.server.session.WebSessionManager; /** @@ -307,12 +308,16 @@ public class WebFluxAutoConfiguration { @Bean @ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME) - public WebSessionManager webSessionManager() { + public WebSessionManager webSessionManager(ObjectProvider webSessionIdResolvers) { DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager(); - CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver(); - webSessionIdResolver.addCookieInitializer((cookie) -> cookie + if (webSessionIdResolvers.getIfAvailable() != null) { + webSessionManager.setSessionIdResolver(webSessionIdResolvers.getIfAvailable()); + return webSessionManager; + } + CookieWebSessionIdResolver cookieWebSessionIdResolver = new CookieWebSessionIdResolver(); + cookieWebSessionIdResolver.addCookieInitializer((cookie) -> cookie .sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute())); - webSessionManager.setSessionIdResolver(webSessionIdResolver); + webSessionManager.setSessionIdResolver(cookieWebSessionIdResolver); return webSessionManager; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java index d63e701e7d8..306c1cc1e42 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java @@ -87,6 +87,8 @@ import org.springframework.web.server.adapter.WebHttpHandlerBuilder; import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; import org.springframework.web.server.i18n.FixedLocaleContextResolver; import org.springframework.web.server.i18n.LocaleContextResolver; +import org.springframework.web.server.session.CookieWebSessionIdResolver; +import org.springframework.web.server.session.WebSessionIdResolver; import org.springframework.web.server.session.WebSessionManager; import org.springframework.web.util.pattern.PathPattern; @@ -562,6 +564,19 @@ class WebFluxAutoConfigurationTests { HighPrecedenceConfigurer.class, WebFluxConfig.class, LowPrecedenceConfigurer.class)); } + @Test + void customWebSessionIdResolverShouldBeApplied() { + this.contextRunner.withUserConfiguration(CustomWebSessionIdResolvers.class).run((context) -> { + MockServerHttpRequest request = MockServerHttpRequest.get("/").build(); + MockServerWebExchange exchange = MockServerWebExchange.from(request); + WebSessionManager webSessionManager = context.getBean(WebSessionManager.class); + WebSession webSession = webSessionManager.getSession(exchange).block(); + webSession.start(); + exchange.getResponse().setComplete().block(); + assertThat(exchange.getResponse().getCookies().get("JSESSIONID")).isNotEmpty(); + }); + } + @Test void customSameSteConfigurationShouldBeApplied() { this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run((context) -> { @@ -584,6 +599,18 @@ class WebFluxAutoConfigurationTests { return Collections.emptyMap(); } + @Configuration(proxyBeanMethods = false) + static class CustomWebSessionIdResolvers { + + @Bean + WebSessionIdResolver webSessionIdResolver() { + CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver(); + resolver.setCookieName("JSESSIONID"); + return resolver; + } + + } + @Configuration(proxyBeanMethods = false) static class CustomArgumentResolvers { From fc0438eda88ffd4f11a1b08d49c0a46db16f6769 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 31 May 2021 14:26:47 +0200 Subject: [PATCH 2/2] Polish "Allow direct use of exposed WebSessionIdResolver bean" See gh-26437 --- .../reactive/WebFluxAutoConfiguration.java | 21 +++++----- .../WebFluxAutoConfigurationTests.java | 40 ++++++++++--------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index fc24a762747..d5fad10b78f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.web.reactive; import java.time.Duration; +import java.util.function.Supplier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -308,19 +309,21 @@ public class WebFluxAutoConfiguration { @Bean @ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME) - public WebSessionManager webSessionManager(ObjectProvider webSessionIdResolvers) { + public WebSessionManager webSessionManager(ObjectProvider webSessionIdResolver) { DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager(); - if (webSessionIdResolvers.getIfAvailable() != null) { - webSessionManager.setSessionIdResolver(webSessionIdResolvers.getIfAvailable()); - return webSessionManager; - } - CookieWebSessionIdResolver cookieWebSessionIdResolver = new CookieWebSessionIdResolver(); - cookieWebSessionIdResolver.addCookieInitializer((cookie) -> cookie - .sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute())); - webSessionManager.setSessionIdResolver(cookieWebSessionIdResolver); + webSessionManager.setSessionIdResolver(webSessionIdResolver.getIfAvailable(cookieWebSessionIdResolver())); return webSessionManager; } + private Supplier cookieWebSessionIdResolver() { + return () -> { + CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver(); + webSessionIdResolver.addCookieInitializer((cookie) -> cookie + .sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute())); + return webSessionIdResolver; + }; + } + } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java index 306c1cc1e42..733fb5f0c69 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import javax.validation.ValidatorFactory; @@ -40,8 +41,10 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; import org.springframework.boot.autoconfigure.validation.ValidatorAdapter; import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration.WebFluxConfig; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; import org.springframework.boot.web.codec.CodecCustomizer; +import org.springframework.boot.web.reactive.context.ReactiveWebApplicationContext; import org.springframework.boot.web.reactive.filter.OrderedHiddenHttpMethodFilter; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -566,29 +569,28 @@ class WebFluxAutoConfigurationTests { @Test void customWebSessionIdResolverShouldBeApplied() { - this.contextRunner.withUserConfiguration(CustomWebSessionIdResolvers.class).run((context) -> { - MockServerHttpRequest request = MockServerHttpRequest.get("/").build(); - MockServerWebExchange exchange = MockServerWebExchange.from(request); - WebSessionManager webSessionManager = context.getBean(WebSessionManager.class); - WebSession webSession = webSessionManager.getSession(exchange).block(); - webSession.start(); - exchange.getResponse().setComplete().block(); - assertThat(exchange.getResponse().getCookies().get("JSESSIONID")).isNotEmpty(); - }); + this.contextRunner.withUserConfiguration(CustomWebSessionIdResolver.class).run(assertExchangeWithSession( + (exchange) -> assertThat(exchange.getResponse().getCookies().get("TEST")).isNotEmpty())); } @Test - void customSameSteConfigurationShouldBeApplied() { - this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run((context) -> { + void customSameSiteConfigurationShouldBeApplied() { + this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run( + assertExchangeWithSession((exchange) -> assertThat(exchange.getResponse().getCookies().get("SESSION")) + .isNotEmpty().allMatch((cookie) -> cookie.getSameSite().equals("Strict")))); + } + + private ContextConsumer assertExchangeWithSession( + Consumer exchange) { + return (context) -> { MockServerHttpRequest request = MockServerHttpRequest.get("/").build(); - MockServerWebExchange exchange = MockServerWebExchange.from(request); + MockServerWebExchange webExchange = MockServerWebExchange.from(request); WebSessionManager webSessionManager = context.getBean(WebSessionManager.class); - WebSession webSession = webSessionManager.getSession(exchange).block(); + WebSession webSession = webSessionManager.getSession(webExchange).block(); webSession.start(); - exchange.getResponse().setComplete().block(); - assertThat(exchange.getResponse().getCookies().get("SESSION")).isNotEmpty() - .allMatch((cookie) -> cookie.getSameSite().equals("Strict")); - }); + webExchange.getResponse().setComplete().block(); + exchange.accept(webExchange); + }; } private Map getHandlerMap(ApplicationContext context) { @@ -600,12 +602,12 @@ class WebFluxAutoConfigurationTests { } @Configuration(proxyBeanMethods = false) - static class CustomWebSessionIdResolvers { + static class CustomWebSessionIdResolver { @Bean WebSessionIdResolver webSessionIdResolver() { CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver(); - resolver.setCookieName("JSESSIONID"); + resolver.setCookieName("TEST"); return resolver; }