调用筛选器的顺序是什么?

2022-09-01 16:51:24

假设我的网络中有追随者.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

按照它们在 Web 中定义映射的顺序.xml

如果使用注释(),顺序似乎未定义 - 您仍然必须在web.xml中声明条目。@WebFilter<filter-mapping>


答案 2

Servlet 规范 3.0 的第 6.2.4 节:

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

容器在构建要应用于特定请求 URI 的筛选器链时使用的顺序如下:

  1. 首先,匹配的筛选器映射的顺序与这些元素在部署描述符中的显示顺序相同。<url-pattern>

  2. 接下来,匹配的筛选器映射的顺序与这些元素在部署描述符中的显示顺序相同。<servlet-name>

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

简而言之:它们按照它们在 XML 文件中出现的顺序应用。如果您点击一个同时被绑定过滤器和绑定过滤器覆盖的URL,那会很有趣,因为这样所有URL模式绑定过滤器都会在所有servlet名称绑定过滤器之前应用。我从来没有遇到过这种情况(根本没有见过任何servlet名称绑定的过滤器),但我认为这可能会很混乱。<url-pattern><servlet-name>


推荐