Skip to content

Commit dfc362b

Browse files
committed
Align FilterRegistrationBean empty dispatcher type logic with FilterRegistration annotation
Closes gh-45130
1 parent f77f3c6 commit dfc362b

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import org.springframework.util.Assert;
3333
import org.springframework.util.ClassUtils;
34+
import org.springframework.util.CollectionUtils;
3435
import org.springframework.util.StringUtils;
3536
import org.springframework.web.filter.OncePerRequestFilter;
3637

@@ -167,7 +168,7 @@ public void addUrlPatterns(String... urlPatterns) {
167168
* @since 3.2.0
168169
*/
169170
public EnumSet<DispatcherType> determineDispatcherTypes() {
170-
if (this.dispatcherTypes == null) {
171+
if (CollectionUtils.isEmpty(this.dispatcherTypes)) {
171172
T filter = getFilter();
172173
if (ClassUtils.isPresent("org.springframework.web.filter.OncePerRequestFilter",
173174
filter.getClass().getClassLoader()) && filter instanceof OncePerRequestFilter) {

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

+64
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,22 @@
2525

2626
import jakarta.servlet.DispatcherType;
2727
import jakarta.servlet.Filter;
28+
import jakarta.servlet.FilterChain;
2829
import jakarta.servlet.FilterRegistration;
2930
import jakarta.servlet.ServletContext;
3031
import jakarta.servlet.ServletException;
32+
import jakarta.servlet.ServletRequest;
33+
import jakarta.servlet.ServletResponse;
34+
import jakarta.servlet.http.HttpServletRequest;
35+
import jakarta.servlet.http.HttpServletResponse;
3136
import org.junit.jupiter.api.Test;
3237
import org.junit.jupiter.api.extension.ExtendWith;
3338
import org.mockito.Mock;
3439
import org.mockito.junit.jupiter.MockitoExtension;
3540

41+
import org.springframework.web.filter.OncePerRequestFilter;
42+
43+
import static org.assertj.core.api.Assertions.assertThat;
3644
import static org.assertj.core.api.Assertions.assertThatCode;
3745
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3846
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
@@ -47,6 +55,7 @@
4755
* Abstract base for {@link AbstractFilterRegistrationBean} tests.
4856
*
4957
* @author Phillip Webb
58+
* @author Moritz Halbritter
5059
*/
5160
@ExtendWith(MockitoExtension.class)
5261
abstract class AbstractFilterRegistrationBeanTests {
@@ -227,6 +236,42 @@ void doesntFailIfDoubleRegistrationIsIgnored() {
227236
}).doesNotThrowAnyException();
228237
}
229238

239+
@Test
240+
void shouldDetermineDispatcherTypesIfNotSet() {
241+
AbstractFilterRegistrationBean<SimpleFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
242+
@Override
243+
public SimpleFilter getFilter() {
244+
return new SimpleFilter();
245+
}
246+
};
247+
assertThat(simpleFilter.determineDispatcherTypes()).containsExactly(DispatcherType.REQUEST);
248+
}
249+
250+
@Test
251+
void shouldDetermineDispatcherTypesForOncePerRequestFilters() {
252+
AbstractFilterRegistrationBean<SimpleOncePerRequestFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
253+
@Override
254+
public SimpleOncePerRequestFilter getFilter() {
255+
return new SimpleOncePerRequestFilter();
256+
}
257+
};
258+
assertThat(simpleFilter.determineDispatcherTypes())
259+
.containsExactlyInAnyOrderElementsOf(EnumSet.allOf(DispatcherType.class));
260+
}
261+
262+
@Test
263+
void shouldDetermineDispatcherTypesForSetDispatcherTypes() {
264+
AbstractFilterRegistrationBean<SimpleFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
265+
@Override
266+
public SimpleFilter getFilter() {
267+
return new SimpleFilter();
268+
}
269+
};
270+
simpleFilter.setDispatcherTypes(DispatcherType.INCLUDE, DispatcherType.FORWARD);
271+
assertThat(simpleFilter.determineDispatcherTypes()).containsExactlyInAnyOrder(DispatcherType.INCLUDE,
272+
DispatcherType.FORWARD);
273+
}
274+
230275
protected abstract Filter getExpectedFilter();
231276

232277
protected abstract AbstractFilterRegistrationBean<?> createFilterRegistrationBean(
@@ -238,4 +283,23 @@ protected final ServletRegistrationBean<?> mockServletRegistration(String name)
238283
return bean;
239284
}
240285

286+
private static final class SimpleFilter implements Filter {
287+
288+
@Override
289+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
290+
291+
}
292+
293+
}
294+
295+
private static final class SimpleOncePerRequestFilter extends OncePerRequestFilter {
296+
297+
@Override
298+
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
299+
FilterChain filterChain) {
300+
301+
}
302+
303+
}
304+
241305
}

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2021 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -45,4 +45,9 @@ protected Filter getExpectedFilter() {
4545
return eq(this.filter);
4646
}
4747

48+
@Override
49+
void shouldDetermineDispatcherTypesForOncePerRequestFilters() {
50+
// Disabled because OncePerRequestFilter isn't on the classpath
51+
}
52+
4853
}

0 commit comments

Comments
 (0)