调用过滤器的顺序是啥? [复制]

Posted

技术标签:

【中文标题】调用过滤器的顺序是啥? [复制]【英文标题】:What will be the order in which filters will be called? [duplicate]调用过滤器的顺序是什么? [复制] 【发布时间】:2011-12-17 19:01:03 【问题描述】:

假设我的 web.xml 中有以下内容

<filter-mapping>
    <filter-name>F1</filter-name>
    <url-pattern>/XYZ/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F2</filter-name>
    <url-pattern>/XYZ/abc.do</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F3</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果请求以 /XYZ/abc.do 的形式出现,过滤器的调用顺序是什么?为什么?

【问题讨论】:

【参考方案1】:

Servlet specification 3.0 的第 6.2.4 节:

当使用&lt;url-pattern&gt; 样式处理&lt;filter-mapping&gt; 元素时,容器必须使用第12 章“将请求映射到Servlet”中定义的路径映射规则来确定&lt;url-pattern&gt; 是否与请求URI 匹配。

容器在构建要应用于特定请求 URI 的过滤器链时使用的顺序如下:

    首先,&lt;url-pattern&gt; 匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。

    接下来,&lt;servlet-name&gt; 匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。

如果过滤器映射同时包含 &lt;servlet-name&gt;&lt;url-pattern&gt;,则容器必须将过滤器映射扩展为多个过滤器映射(&lt;servlet-name&gt;&lt;url-pattern&gt; 各一个),保持 &lt;servlet-name&gt;&lt;url-pattern&gt; 元素。

简而言之:它们按照它们在 XML 文件中出现的顺序应用。如果您点击了一个同时被&lt;url-pattern&gt;&lt;servlet-name&gt; 绑定过滤器覆盖的URL,这会变得很有趣,因为所有URL 模式绑定过滤器都会在所有servlet-name 绑定过滤器之前应用。我从来没有遇到过这种情况(根本没有看到任何 servlet 名称绑定过滤器),但我认为这可能会很混乱。

【讨论】:

感谢您的提示。我的web.xml 中有&lt;url-pattern&gt;&lt;servlet-name&gt; 绑定过滤器,我想知道为什么首先执行URL 模式绑定过滤器,即使在XML 中首先定义了servlet-name 绑定过滤器。【参考方案2】:

按照它们的映射在 web.xml 中定义的顺序

如果使用注释 (@WebFilter) 顺序为 seems to be undefined - 您仍然需要在 web.xml 中声明 &lt;filter-mapping&gt; 条目。

【讨论】:

所以它的 F1,F2,F3?如果是 servlet 怎么办?假设我有 1 个模式匹配 2 个 servlet? 匹配多少 servlet/uris 并不重要。当前目标资源只有一个,对于它,过滤器是按照映射声明的顺序调用的。 (所以是的 - F1,F2,F3) 是的,我明白了。但现在我要问的是一个完全独立的场景,其中相同的 url 模式匹配 2 个不同的 servlet s1 和 s2。将调用哪个 servlet?这个问题与过滤器无关跨度> 如果它是独立的,请再问一个问题;)(并将答案标记为已接受) 好的....................................... ....... :). 你现在可以发表评论吗?

以上是关于调用过滤器的顺序是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

水处理中各种过滤器的顺序是啥

Java Servlet中过滤器概念的实时用法是啥? [复制]

WEB-INF/web.xml 和 conf/web.xml 中定义的 servlet 过滤器的实际执行顺序是啥

Pastebot—剪切板管理工具

测试Shiro过滤器和DispatcherServlet的调用顺序

为啥尽管 web.ignoring().antMatchers() 仍然在此端点上调用我的过滤器? [复制]