Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add missing attributes to FilterRegistration annotation #45005

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import jakarta.servlet.DispatcherType;
import jakarta.servlet.Filter;
import jakarta.servlet.annotation.WebInitParam;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.AliasFor;
Expand All @@ -34,6 +35,7 @@
* annotation-based alternative to {@link FilterRegistrationBean}.
*
* @author Moritz Halbritter
* @author Daeho Kwon
* @since 3.5.0
* @see FilterRegistrationBean
*/
Expand Down Expand Up @@ -81,6 +83,12 @@
*/
boolean ignoreRegistrationFailure() default false;

/**
* Init parameters to be used with the filter.
* @return the init parameters
*/
WebInitParam[] initParameters() default {};

/**
* Whether the filter mappings should be matched after any declared Filter mappings of
* the ServletContext.
Expand All @@ -95,6 +103,12 @@
*/
String[] servletNames() default {};

/**
* Servlet types that the filter will be registered against.
* @return the servlet types
*/
Class<?>[] servletRegistrationBeans() default {};

/**
* URL patterns, as defined in the Servlet specification, that the filter will be
* registered against.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import jakarta.servlet.Filter;
import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.Servlet;
import jakarta.servlet.annotation.WebInitParam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Expand Down Expand Up @@ -63,6 +64,7 @@
* @author Phillip Webb
* @author Brian Clozel
* @author Moritz Halbritter
* @author Daeho Kwon
* @since 1.4.0
*/
public class ServletContextInitializerBeans extends AbstractCollection<ServletContextInitializer> {
Expand Down Expand Up @@ -362,6 +364,17 @@ private void configureFromAnnotation(FilterRegistrationBean<Filter> bean, Filter
bean.setMatchAfter(registration.matchAfter());
bean.setServletNames(Arrays.asList(registration.servletNames()));
bean.setUrlPatterns(Arrays.asList(registration.urlPatterns()));
for (WebInitParam param : registration.initParameters()) {
bean.addInitParameter(param.name(), param.value());
}

this.beanFactory.getBeanProvider(ServletRegistrationBean.class).forEach((servletRegistrationBean) -> {
for (Class<?> servletClass : registration.servletRegistrationBeans()) {
if (servletClass.isInstance(servletRegistrationBean.getServlet())) {
bean.addServletRegistrationBeans(servletRegistrationBean);
}
}
});
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.springframework.boot.web.servlet;

import java.util.Collection;
import java.util.EnumSet;

import jakarta.servlet.DispatcherType;
Expand All @@ -25,6 +26,7 @@
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -47,6 +49,7 @@
*
* @author Andy Wilkinson
* @author Moritz Halbritter
* @author Daeho Kwon
*/
class ServletContextInitializerBeansTests {

Expand Down Expand Up @@ -141,6 +144,14 @@ void shouldApplyFilterRegistrationAnnotation() {
assertThat(filterRegistrationBean.getServletNames()).containsExactly("test");
assertThat(filterRegistrationBean.determineDispatcherTypes()).containsExactly(DispatcherType.ERROR);
assertThat(filterRegistrationBean.getUrlPatterns()).containsExactly("/test/*");
assertThat(filterRegistrationBean.getInitParameters()).containsEntry("env", "test")
.containsEntry("debug", "true");
Collection<ServletRegistrationBean<?>> servletRegistrationBeans = filterRegistrationBean
.getServletRegistrationBeans();
assertThat(servletRegistrationBeans).hasSize(1);
assertThat(servletRegistrationBeans.iterator().next().getServletName())
.isEqualTo("testServletRegistrationBean");

});
}

Expand Down Expand Up @@ -296,11 +307,33 @@ static class FilterConfigurationWithAnnotation {
@Bean
@FilterRegistration(enabled = false, name = "test", asyncSupported = false,
dispatcherTypes = DispatcherType.ERROR, matchAfter = true, servletNames = "test",
urlPatterns = "/test/*")
urlPatterns = "/test/*",
initParameters = { @WebInitParam(name = "env", value = "test"),
@WebInitParam(name = "debug", value = "true") },
servletRegistrationBeans = { TestServlet.class })
TestFilter testFilter() {
return new TestFilter();
}

@Bean
ServletRegistrationBean<TestServlet> testServletRegistrationBean() {
return new ServletRegistrationBean<>(new TestServlet());
}

@Bean
ServletRegistrationBean<NonMatchingServlet> nonMatchingServletRegistrationBean() {
return new ServletRegistrationBean<>(new NonMatchingServlet());
}

static class NonMatchingServlet extends HttpServlet implements ServletContextInitializer {

@Override
public void onStartup(ServletContext servletContext) {

}

}

}

@Configuration(proxyBeanMethods = false)
Expand Down