Align FilterRegistrationBean empty dispatcher type logic with FilterRegistration annotation

Closes gh-45130
This commit is contained in:
Moritz Halbritter
2025-04-14 14:46:15 +02:00
parent f77f3c68b7
commit dfc362b8f8
3 changed files with 72 additions and 2 deletions

View File

@@ -31,6 +31,7 @@ import jakarta.servlet.ServletContext;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
@@ -167,7 +168,7 @@ public abstract class AbstractFilterRegistrationBean<T extends Filter> extends D
* @since 3.2.0
*/
public EnumSet<DispatcherType> determineDispatcherTypes() {
if (this.dispatcherTypes == null) {
if (CollectionUtils.isEmpty(this.dispatcherTypes)) {
T filter = getFilter();
if (ClassUtils.isPresent("org.springframework.web.filter.OncePerRequestFilter",
filter.getClass().getClassLoader()) && filter instanceof OncePerRequestFilter) {

View File

@@ -25,14 +25,22 @@ import java.util.Map;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.web.filter.OncePerRequestFilter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
@@ -47,6 +55,7 @@ import static org.mockito.Mockito.never;
* Abstract base for {@link AbstractFilterRegistrationBean} tests.
*
* @author Phillip Webb
* @author Moritz Halbritter
*/
@ExtendWith(MockitoExtension.class)
abstract class AbstractFilterRegistrationBeanTests {
@@ -227,6 +236,42 @@ abstract class AbstractFilterRegistrationBeanTests {
}).doesNotThrowAnyException();
}
@Test
void shouldDetermineDispatcherTypesIfNotSet() {
AbstractFilterRegistrationBean<SimpleFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
@Override
public SimpleFilter getFilter() {
return new SimpleFilter();
}
};
assertThat(simpleFilter.determineDispatcherTypes()).containsExactly(DispatcherType.REQUEST);
}
@Test
void shouldDetermineDispatcherTypesForOncePerRequestFilters() {
AbstractFilterRegistrationBean<SimpleOncePerRequestFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
@Override
public SimpleOncePerRequestFilter getFilter() {
return new SimpleOncePerRequestFilter();
}
};
assertThat(simpleFilter.determineDispatcherTypes())
.containsExactlyInAnyOrderElementsOf(EnumSet.allOf(DispatcherType.class));
}
@Test
void shouldDetermineDispatcherTypesForSetDispatcherTypes() {
AbstractFilterRegistrationBean<SimpleFilter> simpleFilter = new AbstractFilterRegistrationBean<>() {
@Override
public SimpleFilter getFilter() {
return new SimpleFilter();
}
};
simpleFilter.setDispatcherTypes(DispatcherType.INCLUDE, DispatcherType.FORWARD);
assertThat(simpleFilter.determineDispatcherTypes()).containsExactlyInAnyOrder(DispatcherType.INCLUDE,
DispatcherType.FORWARD);
}
protected abstract Filter getExpectedFilter();
protected abstract AbstractFilterRegistrationBean<?> createFilterRegistrationBean(
@@ -238,4 +283,23 @@ abstract class AbstractFilterRegistrationBeanTests {
return bean;
}
private static final class SimpleFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}
}
private static final class SimpleOncePerRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) {
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,4 +45,9 @@ class NoSpringWebFilterRegistrationBeanTests extends AbstractFilterRegistrationB
return eq(this.filter);
}
@Override
void shouldDetermineDispatcherTypesForOncePerRequestFilters() {
// Disabled because OncePerRequestFilter isn't on the classpath
}
}