8

我的初始化程序中有以下代码:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {

        DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
        shiroFilter.setTargetFilterLifecycle(true);

        return new Filter[]{new CorsFilter(),shiroFilter};
    }
}

我想CorsFilter在之前被处决ShiroFilter。但是,Spring 文档并没有说过滤器的执行顺序取决于它们在返回数组中的顺序。

如果是的话,有人可以澄清一下吗?如果没有,有人可以建议我如何保证过滤器的执行顺序?

4

3 回答 3

13

只是为了使问题保持​​最新。

使用弹簧@Order - 注释

@Component(value = "myCorsFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    [...]

}

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfiguration.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { 
             new DelegatingFilterProxy("myEncodingFilter"), 
             new DelegatingFilterProxy("myCorsFilter"),    // or just new CorsFilter()
             new DelegatingFilterProxy("mySecurityFilter") //...
        };
    }

}
于 2016-01-16T08:12:04.940 回答
4

过滤器按数组的顺序注册。

这导致ServletContext.addFilter()按项目顺序调用,但是,我不确定这是否真的导致容器按照它们注册的顺序执行过滤器。

例如,Tomcat 似乎使用HashMap 来存储过滤器,所以我不希望过滤器必须按照添加它们的顺序运行。

Spring 确实提供了一个org.springframework.web.filter.CompositeFilter,所以我会简单地返回一个CompositeFilter包含您实际想要使用的两个过滤器的单个。

于 2013-12-17T23:18:37.487 回答
0

对于可能想要使用 javax 注释而不是 spring Order 的人,@javax.annotation.Priority也可以使用注释来代替 @Order,就像上面“dit”的答案一样。

于 2016-10-18T18:29:04.570 回答