过滤器将按照什么顺序进行调用?

31

假设我的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

请求中,过滤器将按照其在web.xml文件中声明的顺序被调用。
2个回答

36

按照web.xml中定义的映射顺序执行

如果使用注解(@WebFilter),则执行顺序似乎未定义 - 您仍需在web.xml中声明<filter-mapping>条目。


1
无论匹配多少个servlets/uris,当前目标资源只有一个,并且按照映射声明的顺序调用过滤器。(所以是的 - F1,F2,F3) - Bozho
是的,我明白了。但现在我正在询问一个完全不同的情况,即相同的URL模式匹配到2个不同的servlet s1和s2。哪个servlet将被调用?这个问题与过滤器无关。 - Xyzxyz Xyz
如果这是一个独立的问题,请问另一个问题 ;) (并在本问题上标记一个答案为已接受) - Bozho
可以了,完成了。你现在可以评论了吗? - Xyzxyz Xyz
如果URL模式匹配多个Servlet,会发生什么? - Xyzxyz Xyz
显示剩余2条评论

30
Servlet规范 3.0的6.2.4节内容如下:

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

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

  1. 首先,按照它们在部署描述符中出现的顺序使用<url-pattern>匹配过滤器映射。

  2. 接下来,按照它们在部署描述符中出现的顺序使用<servlet-name>匹配过滤器映射。

如果一个过滤器映射同时包含<servlet-name><url-pattern>,容器必须将该过滤器映射扩展为多个过滤器映射(每个<servlet-name><url-pattern>一个),保留<servlet-name><url-pattern>元素的顺序。

简而言之:过滤器按照它们在XML文件中出现的顺序应用。如果您访问的URL既被<url-pattern>绑定的过滤器覆盖,又被<servlet-name>绑定的过滤器覆盖,那么所有<url-pattern>绑定的过滤器都会在所有<servlet-name>绑定的过滤器之前应用。我从未遇到过这种情况(根本没有看到任何绑定到<servlet-name>的过滤器),但我认为这可能会很令人困惑。

谢谢您的提示。我在我的web.xml中绑定了<url-pattern><servlet-name>过滤器,想知道为什么URL模式绑定的过滤器会先执行,即使在XML中首先定义了servlet名称绑定的过滤器。 - Sky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接