假设我的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中定义的顺序
[如果使用注释(@WebFilter
),则顺序为seems to be undefined-您仍然必须在web.xml中声明<filter-mapping>
条目。
Servlet specification 3.0的6.2.4节:
[使用
<filter-mapping>
样式处理<url-pattern>
元素时,容器必须使用第12章“将请求映射到Servlet”中定义的路径映射规则来确定<url-pattern>
是否与请求URI匹配。容器在构建要应用于特定请求URI的过滤器链时使用的顺序如下:
首先,
<url-pattern>
匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。接下来,
<servlet-name>
匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。[如果过滤器映射同时包含
<servlet-name>
和<url-pattern>
,则容器必须将过滤器映射扩展为多个过滤器映射(每个<servlet-name>
和<url-pattern>
一个),并保留<servlet-name>
和[ C0]个元素。
简而言之:它们以它们在XML文件中出现的顺序应用。如果您命中<url-pattern>
和<url-pattern>
绑定过滤器都覆盖的URL,就会变得很有趣,因为这样,所有URL样式绑定过滤器都将应用在所有servlet名称绑定过滤器之前。我从来没有遇到过这种情况(根本没有看过任何与servlet名称绑定的过滤器),但我认为这可能会造成混乱。