调用过滤器的顺序是什么?

时间:2011-10-29 09:30:28

标签: java java-ee servlets servlet-filters

假设我的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为什么会调用过滤器的顺序是什么?

2 个答案:

答案 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的过滤器链的顺序如下:

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

  2.   
  3. 接下来,<servlet-name>匹配过滤器的映射顺序与这些元素在部署描述符中出现的顺序相同。

  4.         

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

简而言之:它们按照它们出现在XML文件中的顺序应用。如果您点击<url-pattern><servlet-name>绑定过滤器所涵盖的URL,会很有趣,因为所有URL模式绑定过滤器都会在所有servlet-name绑定过滤器之前应用。我从来没有遇到这种情况(根本没有看到任何servlet-name绑定过滤器),但我认为它可能会让人很困惑。