【问题标题】: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 的形式出现,过滤器的调用顺序是什么?为什么?

【问题讨论】:

    标签: java jakarta-ee servlets servlet-filters


    【解决方案1】:

    Servlet specification 3.0 的第 6.2.4 节:

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

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

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

    2. 接下来,&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?这个问题与过滤器无关跨度>
    • 如果它是独立的,请再问一个问题;)(并将答案标记为已接受)
    • 好的....................................... ....... :). 你现在可以发表评论吗?
    猜你喜欢
    • 2013-09-06
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2014-06-26
    • 2011-11-12
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多