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

pde*_*eva 7 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};
    }
}
Run Code Online (Sandbox Code Playgroud)

我想CorsFilter先被执行ShiroFilter.但是,Spring文档并未说明执行过滤器的顺序取决于它们在返回数组中的顺序.

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

die*_*ter 11

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

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

}
Run Code Online (Sandbox Code Playgroud)


Phi*_*ebb 6

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

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

例如,Tomcat 似乎使用HashMap 来存储过滤器,因此我不希望过滤器一定按照添加的顺序运行。

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

  • 似乎没有特别简单的方法来做到这一点。这个答案建议由于 Servlet API 的限制而求助于 XML (http://stackoverflow.com/questions/6560969/how-to-define-servlet-filter-order-of-execution-using-annotations)。您还可以考虑将 CompositeFilter 包装在 OncePerRequestFilter 中。或者也许只是子类 ShiroFilter 并直接调用 CorsFilter 。 (2认同)
  • Tomcat 对 HashMap 的使用是一种转移注意力的做法:在 XML 中声明时,Filter 会按正确的顺序注册和执行,但通过注释发现和注册 Filter 的顺序无法控制。为此,您“必须”使用“web.xml”或某种复合“Filter”。 (2认同)