调用过滤器的顺序是什么?

Xyz*_*Xyz 14 java servlets java-ee servlet-filters

假设我在我的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>
Run Code Online (Sandbox Code Playgroud)

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

Boz*_*zho 21

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

如果使用annotations(@WebFilter),顺序似乎是未定义的 - 您仍然需要<filter-mapping>在web.xml中声明条目.


Bar*_*end 20

Servlet规范3.0的 6.2.4节:

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

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

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

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

如果一个过滤器映射同时包含<servlet-name><url-pattern>,容器必须扩大过滤器映射到多个过滤器映射(每个<servlet-name><url-pattern>),保留的顺序<servlet-name><url-pattern>内容.

简而言之:它们按照它们出现在XML文件中的顺序应用.如果你点击两个<url-pattern><servlet-name>绑定过滤器所覆盖的URL会很有趣,因为所有的URL模式绑定过滤器都会在所有servlet-name绑定过滤器之前应用.我从来没有遇到这种情况(根本没有看到任何servlet-name绑定过滤器),但我认为它可能会让人很困惑.