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;
}
}