假设我的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.And为什么会调用过滤器的顺序是什么?
答案 0 :(得分:18)
按顺序在web.xml中定义其映射
如果使用注释(@WebFilter
)订单seems to be undefined - 您仍然需要在web.xml中声明<filter-mapping>
个条目。
答案 1 :(得分:16)
Servlet specification 3.0的第6.2.4节:
使用
<filter-mapping>
样式处理<url-pattern>
元素时,容器必须使用第12章“映射请求到”中定义的路径映射规则来确定<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-name绑定过滤器),但我认为它可能会让人很困惑。