Skip to content

Commit 8e695b0

Browse files
committed
Configure OncePerRequestFilters with all dispatcher types by default
Closes gh-18953
1 parent 1085dcc commit 8e695b0

File tree

3 files changed

+86
-1
lines changed

3 files changed

+86
-1
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
import javax.servlet.ServletContext;
3131

3232
import org.springframework.util.Assert;
33+
import org.springframework.util.ClassUtils;
3334
import org.springframework.util.StringUtils;
35+
import org.springframework.web.filter.OncePerRequestFilter;
3436

3537
/**
3638
* Abstract base {@link ServletContextInitializer} to register {@link Filter}s in a
@@ -218,7 +220,14 @@ protected void configure(FilterRegistration.Dynamic registration) {
218220
super.configure(registration);
219221
EnumSet<DispatcherType> dispatcherTypes = this.dispatcherTypes;
220222
if (dispatcherTypes == null) {
221-
dispatcherTypes = EnumSet.of(DispatcherType.REQUEST);
223+
T filter = getFilter();
224+
if (ClassUtils.isPresent("org.springframework.web.filter.OncePerRequestFilter",
225+
filter.getClass().getClassLoader()) && filter instanceof OncePerRequestFilter) {
226+
dispatcherTypes = EnumSet.allOf(DispatcherType.class);
227+
}
228+
else {
229+
dispatcherTypes = EnumSet.of(DispatcherType.REQUEST);
230+
}
222231
}
223232
Set<String> servletNames = new LinkedHashSet<>();
224233
for (ServletRegistrationBean<?> servletRegistrationBean : this.servletRegistrationBeans) {

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,20 @@
1616

1717
package org.springframework.boot.web.servlet;
1818

19+
import java.io.IOException;
20+
import java.util.EnumSet;
21+
22+
import javax.servlet.DispatcherType;
1923
import javax.servlet.Filter;
24+
import javax.servlet.FilterChain;
25+
import javax.servlet.ServletException;
26+
import javax.servlet.http.HttpServletRequest;
27+
import javax.servlet.http.HttpServletResponse;
2028

2129
import org.junit.jupiter.api.Test;
2230

2331
import org.springframework.boot.web.servlet.mock.MockFilter;
32+
import org.springframework.web.filter.OncePerRequestFilter;
2433

2534
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
2635
import static org.mockito.ArgumentMatchers.eq;
@@ -35,6 +44,16 @@ class FilterRegistrationBeanTests extends AbstractFilterRegistrationBeanTests {
3544

3645
private final MockFilter filter = new MockFilter();
3746

47+
private final OncePerRequestFilter oncePerRequestFilter = new OncePerRequestFilter() {
48+
49+
@Override
50+
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
51+
FilterChain filterChain) throws ServletException, IOException {
52+
filterChain.doFilter(request, response);
53+
}
54+
55+
};
56+
3857
@Test
3958
void setFilter() throws Exception {
4059
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
@@ -63,6 +82,15 @@ void createServletRegistrationBeanMustNotBeNull() {
6382
.withMessageContaining("ServletRegistrationBeans must not be null");
6483
}
6584

85+
@Test
86+
void startupWithOncePerRequestDefaults() throws Exception {
87+
FilterRegistrationBean<?> bean = new FilterRegistrationBean<>(this.oncePerRequestFilter);
88+
bean.onStartup(this.servletContext);
89+
verify(this.servletContext).addFilter(eq("oncePerRequestFilter"), eq(this.oncePerRequestFilter));
90+
verify(this.registration).setAsyncSupported(true);
91+
verify(this.registration).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
92+
}
93+
6694
@Override
6795
protected AbstractFilterRegistrationBean<MockFilter> createFilterRegistrationBean(
6896
ServletRegistrationBean<?>... servletRegistrationBeans) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright 2012-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.web.servlet;
18+
19+
import javax.servlet.Filter;
20+
21+
import org.springframework.boot.testsupport.classpath.ClassPathExclusions;
22+
import org.springframework.boot.web.servlet.mock.MockFilter;
23+
24+
import static org.mockito.ArgumentMatchers.eq;
25+
26+
/**
27+
* Tests for {@link FilterRegistrationBean} when {@code spring-web} is not on the
28+
* classpath.
29+
*
30+
* @author Andy Wilkinson
31+
*/
32+
@ClassPathExclusions("spring-web-*.jar")
33+
public class NoSpringWebFilterRegistrationBeanTests extends AbstractFilterRegistrationBeanTests {
34+
35+
private final MockFilter filter = new MockFilter();
36+
37+
@Override
38+
protected AbstractFilterRegistrationBean<MockFilter> createFilterRegistrationBean(
39+
ServletRegistrationBean<?>... servletRegistrationBeans) {
40+
return new FilterRegistrationBean<>(this.filter, servletRegistrationBeans);
41+
}
42+
43+
@Override
44+
protected Filter getExpectedFilter() {
45+
return eq(this.filter);
46+
}
47+
48+
}

0 commit comments

Comments
 (0)