调用过滤器的顺序是啥? [复制]
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 节:
当使用
<url-pattern>
样式处理<filter-mapping>
元素时,容器必须使用第12 章“将请求映射到Servlet”中定义的路径映射规则来确定<url-pattern>
是否与请求URI 匹配。容器在构建要应用于特定请求 URI 的过滤器链时使用的顺序如下:
首先,
<url-pattern>
匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。接下来,
<servlet-name>
匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。如果过滤器映射同时包含
<servlet-name>
和<url-pattern>
,则容器必须将过滤器映射扩展为多个过滤器映射(<servlet-name>
和<url-pattern>
各一个),保持<servlet-name>
和<url-pattern>
元素。
简而言之:它们按照它们在 XML 文件中出现的顺序应用。如果您点击了一个同时被<url-pattern>
和<servlet-name>
绑定过滤器覆盖的URL,这会变得很有趣,因为所有URL 模式绑定过滤器都会在所有servlet-name 绑定过滤器之前应用。我从来没有遇到过这种情况(根本没有看到任何 servlet 名称绑定过滤器),但我认为这可能会很混乱。
【讨论】:
感谢您的提示。我的web.xml
中有<url-pattern>
和<servlet-name>
绑定过滤器,我想知道为什么首先执行URL 模式绑定过滤器,即使在XML 中首先定义了servlet-name 绑定过滤器。【参考方案2】:
按照它们的映射在 web.xml 中定义的顺序
如果使用注释 (@WebFilter
) 顺序为 seems to be undefined - 您仍然需要在 web.xml 中声明 <filter-mapping>
条目。
【讨论】:
所以它的 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 过滤器的实际执行顺序是啥