我正在尝试在我的spring启动应用程序中设置具有相同url映射的2个过滤器的执行顺序。我尝试在我的主Application类中使用2个过滤器注册bean,如下所示,但是没有用。我想首先点击authorizationFilter
然后点击validationFilter
。但是,当两者都配置时,它总是只能validationFilter
。如果我发表评论validationFilter
,则会点击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文件。
<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,因为它只使用上面的配置命中验证过滤器。 我很感激解决这个问题的任何意见。 感谢
答案 0 :(得分:46)
setOrder(int)
方法完成了这项工作。
是一个例子
@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;
}
}
答案 1 :(得分:17)
Spring Boot在将FilterRegistrationBean
应用到servlet上下文之前使用AnnotationAwareOrderComparator
对其进行排序。 RegistrationBean
目前不是Ordered
,因此无法通过调用方法来设置顺序,但您可以通过创建子类并向其添加@Order
来解决此问题。我认为创建基类Ordered
并提供一个setter在框架中可能是一件有用的事情(如果你同意的话,在github上打开一个问题)。
更新:{1.0}中添加了Ordered
。
答案 2 :(得分:-7)
Bean名称将解决您的问题:@Bean(&#34; aFilter&#34;)。