以编程方式注册过滤器时的 Servlet 过滤器顺序

Posted

技术标签:

【中文标题】以编程方式注册过滤器时的 Servlet 过滤器顺序【英文标题】:Servlet Filter Order When Filters are Registered Programmatically 【发布时间】:2018-03-08 22:40:46 【问题描述】:

我有几个 Servlet 过滤器需要按顺序执行 - 一个接一个。 我不想在 web.xml 文件中声明它们,也不想使用 @WebFilter 注释。 相反,我使用 ServletContext.addFilter() 方法。

问题是:过滤器的链接顺序是否与我调用 addFilter() 方法的顺序相同?这是否记录在某处?

我看到了这个问题和答案:How to define servlet filter order of execution using annotations in WAR 但它不包括我的程序化案例。

【问题讨论】:

【参考方案1】:

我不知道使用ServletContext.addFilter 添加的过滤器顺序的任何定义,所以我不希望有特殊顺序。

我不知道您是否称其为 代码气味,但可以使用 addFilter 添加过滤器并在过滤器中调用另一个过滤器。这样,您的代码就定义了这两个过滤器的顺序。我知道这不是最好的方法,但也许它可以帮助你。

【讨论】:

【参考方案2】:

似乎过滤器是按照调用 ServletContext 的方法的顺序添加的,至少在 Tomcat 中是这样。

如果我们查看 tomcat 8 的源代码,有一个类 ContextFilterMap(在 StandardContext.java 中),它保留了一个过滤器映射数组。并且有两种方法:add 和 addBefore,它们保留了一个“插入点”变量,该变量保持插入顺序。

【讨论】:

以上是关于以编程方式注册过滤器时的 Servlet 过滤器顺序的主要内容,如果未能解决你的问题,请参考以下文章

在 servlet 中以编程方式调用过滤器(使用码头/火花创建)?

过滤器

防止 Spring Boot 注册 servlet 过滤器

[JavaWeb] Servlet Filter

覆盖 JSP servlet(过滤器“*.jsp”)以包装身份验证模型

Servlet过滤器——日志记录过滤器