如何使用Spring的Java配置指定过滤器执行顺序?

时间:2013-12-17 22:23:57

标签: java spring spring-java-config

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

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文档并未说明执行过滤器的顺序取决于它们在返回数组中的顺序。

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

3 个答案:

答案 0 :(得分:11)

只是为了让问题保持最新。

使用弹簧@Order - Annotation

@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") //...
        };
    }

}

答案 1 :(得分:4)

过滤器已在order of the array中注册。

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

例如,Tomcat似乎使用a HashMap to store filters,因此我不希望过滤器必须按照添加的顺序运行。

Spring确实提供了org.springframework.web.filter.CompositeFilter,因此我只返回一个包含您实际想要使用的两个过滤器的CompositeFilter

答案 2 :(得分:0)

对于可能想要使用javax注释而不是spring order的人,也可以使用@javax.annotation.Priority注释代替@Order,例如来自&#34; dit&#34;上面。