如何在 Spring Boot 应用程序中定义 Servlet 过滤器的执行顺序
我正在尝试在具有相同 url 映射的 Spring Boot 应用程序中设置 2 个过滤器的执行顺序.我已经尝试在我的主应用程序类中使用 2 个过滤器注册 bean,如下所示,但没有奏效.我希望 authorizationFilter
先被命中,然后是 validationFilter
.但是当两者都配置时,它总是只有 validationFilter
.如果我注释掉 validationFilter
,它会命中 authorizationFilter
.
I am trying to set the order of execution of 2 filters in my spring boot application which have same url mapping. I have tried using 2 filter registration beans in my main Application class as below but that did not work. I want the authorizationFilter
to be hit first then the validationFilter
. But it is always hitting ONLY validationFilter
when both are configured. If I comment out the validationFilter
, it hits 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;
}
我也试过引入 web.xml
并将可执行 jar 文件转换为 war 文件.
I have also tried introducing web.xml
and converting the executable jar to war file.
<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>
但该应用程序似乎无法识别 web.xml,因为它仅命中具有上述配置的验证过滤器.我感谢任何解决此问题的意见.谢谢
But the application doesn't seem to recognize the web.xml, as it hits only the validation filter with the configuration above. I appreciate any inputs in resolving this. Thanks
setOrder(int)
方法完成这项工作.
setOrder(int)
method does the job.
下面是一个例子
@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;
}
}