过滤器的调用顺序是什么? [重复]

问题描述 投票:15回答:2

假设我的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
2个回答
21
投票

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

[如果使用注释(@WebFilter),则顺序为seems to be undefined-您仍然必须在web.xml中声明<filter-mapping>条目。


20
投票

Servlet specification 3.0的6.2.4节:

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

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

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

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

[如果过滤器映射同时包含<servlet-name><url-pattern>,则容器必须将过滤器映射扩展为多个过滤器映射(每个<servlet-name><url-pattern>一个),并保留<servlet-name>和[ C0]个元素。

简而言之:它们以它们在XML文件中出现的顺序应用。如果您命中<url-pattern><url-pattern>绑定过滤器都覆盖的URL,就会变得很有趣,因为这样,所有URL样式绑定过滤器都将应用在所有servlet名称绑定过滤器之前。我从来没有遇到过这种情况(根本没有看过任何与servlet名称绑定的过滤器),但我认为这可能会造成混乱。

© www.soinside.com 2019 - 2024. All rights reserved.