Skip to content

Commit 64ee544

Browse files
committed
Polish "Configure ForwardedHeaderFilter with Tomcat's use relative redirects"
See gh-29333
1 parent cec69fe commit 64ee544

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,21 @@ public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCust
8787

8888
@Configuration(proxyBeanMethods = false)
8989
@ConditionalOnProperty(value = "server.forward-headers-strategy", havingValue = "framework")
90+
@ConditionalOnMissingFilterBean(ForwardedHeaderFilter.class)
9091
static class ForwardedHeaderFilterConfiguration {
9192

9293
@Bean
9394
@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
9495
@ConditionalOnMissingFilterBean(ForwardedHeaderFilter.class)
95-
public FilterRegistrationBean<ForwardedHeaderFilter> tomcatForwardedHeaderFilter(
96-
ServerProperties serverProperties) {
97-
return createForwardedHeaderFilter(serverProperties.getTomcat().isUseRelativeRedirects());
96+
ForwardedHeaderFilterCustomizer tomcatForwardedHeaderFilterCustomizer(ServerProperties serverProperties) {
97+
return (filter) -> filter.setRelativeRedirects(serverProperties.getTomcat().isUseRelativeRedirects());
9898
}
9999

100100
@Bean
101-
@ConditionalOnMissingFilterBean(ForwardedHeaderFilter.class)
102-
public FilterRegistrationBean<ForwardedHeaderFilter> defaultForwardedHeaderFilter() {
103-
return createForwardedHeaderFilter(false);
104-
}
105-
106-
private FilterRegistrationBean<ForwardedHeaderFilter> createForwardedHeaderFilter(boolean relativeRedirects) {
101+
FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter(
102+
ObjectProvider<ForwardedHeaderFilterCustomizer> customizerProvider) {
107103
ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
108-
filter.setRelativeRedirects(relativeRedirects);
104+
customizerProvider.ifAvailable((customizer) -> customizer.customize(filter));
109105
FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
110106
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR);
111107
registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
@@ -114,6 +110,12 @@ private FilterRegistrationBean<ForwardedHeaderFilter> createForwardedHeaderFilte
114110

115111
}
116112

113+
interface ForwardedHeaderFilterCustomizer {
114+
115+
void customize(ForwardedHeaderFilter filter);
116+
117+
}
118+
117119
/**
118120
* Registers a {@link WebServerFactoryCustomizerBeanPostProcessor}. Registered via
119121
* {@link ImportBeanDefinitionRegistrar} for early registration.

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryAutoConfigurationTests.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import org.springframework.context.annotation.Bean;
5858
import org.springframework.context.annotation.Configuration;
5959
import org.springframework.stereotype.Component;
60-
import org.springframework.test.util.ReflectionTestUtils;
6160
import org.springframework.web.filter.ForwardedHeaderFilter;
6261
import org.springframework.web.servlet.DispatcherServlet;
6362
import org.springframework.web.servlet.FrameworkServlet;
@@ -353,6 +352,7 @@ void forwardedHeaderFilterShouldBeConfigured() {
353352
assertThat(context).hasSingleBean(FilterRegistrationBean.class);
354353
Filter filter = context.getBean(FilterRegistrationBean.class).getFilter();
355354
assertThat(filter).isInstanceOf(ForwardedHeaderFilter.class);
355+
assertThat(filter).extracting("relativeRedirects").isEqualTo(false);
356356
});
357357
}
358358

@@ -376,11 +376,24 @@ void relativeRedirectsShouldBeEnabledWhenUsingTomcatContainerAndUseRelativeRedir
376376
.withConfiguration(AutoConfigurations.of(ServletWebServerFactoryAutoConfiguration.class))
377377
.withPropertyValues("server.forward-headers-strategy=framework",
378378
"server.tomcat.use-relative-redirects=true");
379+
runner.run((context) -> {
380+
Filter filter = context.getBean(FilterRegistrationBean.class).getFilter();
381+
assertThat(filter).isInstanceOf(ForwardedHeaderFilter.class);
382+
assertThat(filter).extracting("relativeRedirects").isEqualTo(true);
383+
});
384+
}
379385

386+
@Test
387+
void relativeRedirectsShouldNotBeEnabledWhenUsingTomcatContainerAndNotUsingRelativeRedirects() {
388+
WebApplicationContextRunner runner = new WebApplicationContextRunner(
389+
AnnotationConfigServletWebServerApplicationContext::new)
390+
.withConfiguration(AutoConfigurations.of(ServletWebServerFactoryAutoConfiguration.class))
391+
.withPropertyValues("server.forward-headers-strategy=framework",
392+
"server.tomcat.use-relative-redirects=false");
380393
runner.run((context) -> {
381394
Filter filter = context.getBean(FilterRegistrationBean.class).getFilter();
382-
Boolean relativeRedirects = (Boolean) ReflectionTestUtils.getField(filter, "relativeRedirects");
383-
assertThat(relativeRedirects).isTrue();
395+
assertThat(filter).isInstanceOf(ForwardedHeaderFilter.class);
396+
assertThat(filter).extracting("relativeRedirects").isEqualTo(false);
384397
});
385398
}
386399

@@ -391,11 +404,10 @@ void relativeRedirectsShouldNotBeEnabledWhenNotUsingTomcatContainer() {
391404
.withClassLoader(new FilteredClassLoader(Tomcat.class))
392405
.withConfiguration(AutoConfigurations.of(ServletWebServerFactoryAutoConfiguration.class))
393406
.withPropertyValues("server.forward-headers-strategy=framework");
394-
395407
runner.run((context) -> {
396408
Filter filter = context.getBean(FilterRegistrationBean.class).getFilter();
397-
Boolean relativeRedirects = (Boolean) ReflectionTestUtils.getField(filter, "relativeRedirects");
398-
assertThat(relativeRedirects).isFalse();
409+
assertThat(filter).isInstanceOf(ForwardedHeaderFilter.class);
410+
assertThat(filter).extracting("relativeRedirects").isEqualTo(false);
399411
});
400412
}
401413

0 commit comments

Comments
 (0)