有什么方法可以指定在web.xml中声明它之外的过滤器的顺序吗?

问题描述:

从Servlet 3.0开始,我们现在可以通过注释(@WebFilter)或动态(通过ServletContext对象)声明Web过滤器。有什么方法可以指定在web.xml中声明它之外的过滤器的顺序吗?

我知道使用@WebFilter不允许指定过滤顺序。同样,我还没有找到任何方式来指定通过ServletContext.addFilter()方法动态声明时的顺序。我查看了FilterRegistration对象,但也没有任何内容。

这是否意味着在过滤器链中指定过滤器顺序的唯一方法是通过web.xml?有没有其他机制可用?这不是Servlet 3.0+的重大监督吗?

在链中执行通过注释或通过ServletContext对象声明的过滤器?在web.xml中声明的那些结尾处?未定义?

这是否意味着在过滤器链中指定过滤器顺序的唯一方法是通过web.xml?

是的。检查Servlet 3.0 spec的以下部分:

  • 4.4.2编程方式添加和配置过滤器过滤器的

  • 6.2.4配置在Web应用程序

  • 8.1.2 @WebFilter

提到过滤器排序的唯一地方是在6.2.4节中,它指定了如何使用web.xml。在addFilter()@WebFilter的章节中未提及订购。

有没有其他机制可用?

不在Servlet 3.0规范中,所以没有。

这不是Servlet 3.0+的重大疏漏吗?

我怀疑这种遗漏是“疏忽”。来自BalusC的评论是relevant SO post为什么没有其他机制提供了一个合理的理由:如果您的webapp带有包含过滤器的第三方库,该怎么办?事先很难说出它的顺序。

在链中执行通过注释或通过ServletContext对象声明的过滤器?在web.xml中声明的那些结尾处? 未定义?

由于规范没有解决这些情况,因此排序必然是未定义的。