除了在 web.xml 中声明过滤器之外,还有啥方法可以指定过滤器的顺序吗?

Posted

技术标签:

【中文标题】除了在 web.xml 中声明过滤器之外,还有啥方法可以指定过滤器的顺序吗?【英文标题】:Is there any way to specify the order of a filter outside of declaring it in web.xml?除了在 web.xml 中声明过滤器之外,还有什么方法可以指定过滤器的顺序吗? 【发布时间】:2018-03-16 09:13:39 【问题描述】:

从 Servlet 3.0 开始,我们现在可以通过注解 (@WebFilter) 或动态(通过 ServletContext 对象)声明 Web 过滤器。

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

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

通过注解或通过 ServletContext 对象声明的过滤器在链中的哪个位置?在 web.xml 中声明的那些末尾?未定义?

【问题讨论】:

【参考方案1】:

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

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

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

6.2.4 在 Web 应用程序中配置过滤器

8.1.2 @WebFilter

唯一提到过滤器排序的地方是第 6.2.4 节,它指定了如何使用 web.xmladdFilter()@WebFilter 部分未提及排序。

没有其他可用的机制吗?

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

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

我怀疑遗漏是“疏忽”。 BalusC 的评论是 relevant SO post 提供了一个合理的理由说明为什么没有替代机制:如果您的 web 应用程序附带包含过滤器的 3rd 方库怎么办?很难事先知道它的顺序。

通过注解或通过 ServletContext 对象声明的过滤器在链中的哪个位置?在 web.xml 中声明的那些末尾? 未定义?

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

【讨论】:

以上是关于除了在 web.xml 中声明过滤器之外,还有啥方法可以指定过滤器的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

除了明显的错误配置问题之外,还有啥可能导致 Servlet 过滤器的 ClassNotFoundException?

ssh_maven之controller层开发

servlet 过滤器是不是必须在 web.xml 文件中指定?

除了按位否定运算之外,“~”在 python 中还有啥作用? [复制]

请教一个问题,关于web.xml配置的

JSF 面对 WEB-INF 之外的配置文件?