如何在Spring Boot应用程序中定义Servlet过滤器的执行顺序

时间:2014-03-17 11:58:54

标签: spring-boot

我正在尝试在我的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,因为它只使用上面的配置命中验证过滤器。 我很感激解决这个问题的任何意见。 感谢

3 个答案:

答案 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;)。