从Servlet 3.0开始,我们现在可以通过注释(@WebFilter)或动态(通过ServletContext对象)声明Web过滤器。
我知道使用@WebFilter不允许指定过滤器顺序。类似地,我没有找到任何方法来通过ServletContext.addFilter()方法动态声明它时指定顺序。我查看了FilterRegistration对象,但也没有任何内容。
这是否意味着在过滤器链中指定过滤器顺序的唯一方法是通过web.xml?没有其他机制可用吗?这不是对Servlet 3.0 +的重大监督吗?
链中的哪个位置通过注释或ServletContext对象声明过滤器?在web.xml中声明的那些结尾?未定义?
答案 0 :(得分:2)
这是否意味着在过滤器链中指定过滤器顺序的唯一方法是通过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中声明的那些结尾? 未定义?
由于规范没有解决这些问题,因此排序必须是未定义的。