register onceperrequestfilter example custom before spring-boot

onceperrequestfilter - Cómo definir el orden de ejecución del filtro del servlet en la aplicación Spring Boot



spring boot web filter (3)

El nombre de Bean resolverá su problema: @Bean ("aFilter").

Estoy tratando de establecer el orden de ejecución de 2 filtros en mi aplicación de arranque de primavera que tienen el mismo mapeo de url. He intentado usar 2 beans de registro de filtro en mi clase de aplicación principal como la siguiente, pero eso no funcionó. Quiero que el authorizationFilter sea ​​golpeado primero y luego el validationFilter . Pero siempre está golpeando SOLAMENTE validationFilter cuando ambos están configurados. Si hago un comentario sobre validationFilter , golpea a authorizationFilter .

@Bean public FilterRegistrationBean authorizationFilter(){ FilterRegistrationBean filterRegBean = new FilterRegistrationBean(); filterRegBean.setFilter(authorizationFilter); List<String> urlPatterns = new ArrayList<String>(); urlPatterns.add("/v1/*"); filterRegBean.setUrlPatterns(urlPatterns); return filterRegBean; } @Bean public FilterRegistrationBean validationFilter(){ FilterRegistrationBean filterRegBean = new FilterRegistrationBean(); filterRegBean.setFilter(validationFilter); List<String> urlPatterns = new ArrayList<String>(); urlPatterns.add("/v1/*"); filterRegBean.setUrlPatterns(urlPatterns); return filterRegBean; }

También intenté introducir web.xml y convertir el archivo ejecutable a war.

<web-app> <filter> <filter-name>authorizationFilter</filter-name> <filter-class>com.security.filter.AuthorizationFilter</filter-class> </filter> <filter-mapping> <filter-name>authorizationFilter</filter-name> <url-pattern>/v1/*</url-pattern> </filter-mapping> <filter> <filter-name>validationFilter</filter-name> <filter-class>com.security.validation.ValidationFilter</filter-class> </filter> <filter-mapping> <filter-name>validationFilter</filter-name> <url-pattern>/v1/*</url-pattern> </filter-mapping> </web-app>

Pero la aplicación no parece reconocer web.xml, ya que solo afecta al filtro de validación con la configuración anterior. Agradezco cualquier aporte para resolver esto. Gracias


Spring Boot ordena su FilterRegistrationBean usando AnnotationAwareOrderComparator antes de aplicarlos al contexto de servlet. El RegistrationBean no está actualmente Ordered por lo que no hay forma de establecer el orden llamando a un método, pero puede @Order creando subclases y añadiéndole @Order . Creo que hacer la clase base Ordered y proporcionar un setter es probablemente algo útil que hacer en el framework (abre un problema en github si estás de acuerdo).

Actualización: Ordered se agregó en 1.0.x.


setOrder(int) hace el trabajo.

a continuación hay un ejemplo

@Configuration @EnableAutoConfiguration @EnableWebMvc @ComponentScan public class Application { @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); SecurityFilter securityFilter = new SecurityFilter(); registrationBean.setFilter(securityFilter); registrationBean.setOrder(2); return registrationBean; } @Bean public FilterRegistrationBean contextFilterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); RequestContextFilter contextFilter = new RequestContextFilter(); registrationBean.setFilter(contextFilter); registrationBean.setOrder(1); return registrationBean; } }