Polish "Allow direct use of exposed WebSessionIdResolver bean"
See gh-26437
This commit is contained in:
parent
65ce1454e0
commit
fc0438eda8
|
@ -17,6 +17,7 @@
|
||||||
package org.springframework.boot.autoconfigure.web.reactive;
|
package org.springframework.boot.autoconfigure.web.reactive;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
@ -308,19 +309,21 @@ public class WebFluxAutoConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME)
|
@ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME)
|
||||||
public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolvers) {
|
public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver) {
|
||||||
DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
|
DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
|
||||||
if (webSessionIdResolvers.getIfAvailable() != null) {
|
webSessionManager.setSessionIdResolver(webSessionIdResolver.getIfAvailable(cookieWebSessionIdResolver()));
|
||||||
webSessionManager.setSessionIdResolver(webSessionIdResolvers.getIfAvailable());
|
|
||||||
return webSessionManager;
|
|
||||||
}
|
|
||||||
CookieWebSessionIdResolver cookieWebSessionIdResolver = new CookieWebSessionIdResolver();
|
|
||||||
cookieWebSessionIdResolver.addCookieInitializer((cookie) -> cookie
|
|
||||||
.sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute()));
|
|
||||||
webSessionManager.setSessionIdResolver(cookieWebSessionIdResolver);
|
|
||||||
return webSessionManager;
|
return webSessionManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Supplier<WebSessionIdResolver> cookieWebSessionIdResolver() {
|
||||||
|
return () -> {
|
||||||
|
CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver();
|
||||||
|
webSessionIdResolver.addCookieInitializer((cookie) -> cookie
|
||||||
|
.sameSite(this.webFluxProperties.getSession().getCookie().getSameSite().attribute()));
|
||||||
|
return webSessionIdResolver;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import javax.validation.ValidatorFactory;
|
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.ValidationAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.validation.ValidatorAdapter;
|
import org.springframework.boot.autoconfigure.validation.ValidatorAdapter;
|
||||||
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration.WebFluxConfig;
|
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.test.context.runner.ReactiveWebApplicationContextRunner;
|
||||||
import org.springframework.boot.web.codec.CodecCustomizer;
|
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.boot.web.reactive.filter.OrderedHiddenHttpMethodFilter;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
@ -566,29 +569,28 @@ class WebFluxAutoConfigurationTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void customWebSessionIdResolverShouldBeApplied() {
|
void customWebSessionIdResolverShouldBeApplied() {
|
||||||
this.contextRunner.withUserConfiguration(CustomWebSessionIdResolvers.class).run((context) -> {
|
this.contextRunner.withUserConfiguration(CustomWebSessionIdResolver.class).run(assertExchangeWithSession(
|
||||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
(exchange) -> assertThat(exchange.getResponse().getCookies().get("TEST")).isNotEmpty()));
|
||||||
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
|
@Test
|
||||||
void customSameSteConfigurationShouldBeApplied() {
|
void customSameSiteConfigurationShouldBeApplied() {
|
||||||
this.contextRunner.withPropertyValues("spring.webflux.session.cookie.same-site:strict").run((context) -> {
|
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<ReactiveWebApplicationContext> assertExchangeWithSession(
|
||||||
|
Consumer<MockServerWebExchange> exchange) {
|
||||||
|
return (context) -> {
|
||||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
||||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
MockServerWebExchange webExchange = MockServerWebExchange.from(request);
|
||||||
WebSessionManager webSessionManager = context.getBean(WebSessionManager.class);
|
WebSessionManager webSessionManager = context.getBean(WebSessionManager.class);
|
||||||
WebSession webSession = webSessionManager.getSession(exchange).block();
|
WebSession webSession = webSessionManager.getSession(webExchange).block();
|
||||||
webSession.start();
|
webSession.start();
|
||||||
exchange.getResponse().setComplete().block();
|
webExchange.getResponse().setComplete().block();
|
||||||
assertThat(exchange.getResponse().getCookies().get("SESSION")).isNotEmpty()
|
exchange.accept(webExchange);
|
||||||
.allMatch((cookie) -> cookie.getSameSite().equals("Strict"));
|
};
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<PathPattern, Object> getHandlerMap(ApplicationContext context) {
|
private Map<PathPattern, Object> getHandlerMap(ApplicationContext context) {
|
||||||
|
@ -600,12 +602,12 @@ class WebFluxAutoConfigurationTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
static class CustomWebSessionIdResolvers {
|
static class CustomWebSessionIdResolver {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
WebSessionIdResolver webSessionIdResolver() {
|
WebSessionIdResolver webSessionIdResolver() {
|
||||||
CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
|
CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
|
||||||
resolver.setCookieName("JSESSIONID");
|
resolver.setCookieName("TEST");
|
||||||
return resolver;
|
return resolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue