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

Java 过滤器的调用顺序是什么?,java,jakarta-ee,servlets,servlet-filters,Java,Jakarta 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&

假设我的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/*
地上二层
/XYZ/abc.do
F3
/*

如果请求以/XYZ/abc.do.的形式出现,那么调用过滤器的顺序是什么?为什么?

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

如果使用注释(
@WebFilter
),则顺序-您仍然必须在web.xml中声明
条目。

第6.2.4节:

当使用
样式处理
元素时,容器必须使用第12章“将请求映射到servlet”中定义的路径映射规则确定
是否与请求URI匹配

容器用于构建过滤器链以应用于特定请求URI的顺序如下:

  • 首先,
    匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同

  • 接下来,
    将按照这些元素在部署描述符中出现的相同顺序匹配过滤器映射

  • 如果筛选器映射同时包含
    ,则容器必须将筛选器映射扩展为多个筛选器映射(每个
    对应一个),以保留
    元素的顺序


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

    那么它是F1、F2、F3?如果是servlet呢?假设我有1个模式匹配2个servlet?它匹配多少servlet/uri并不重要。当前目标资源只有一个,对于它,将按照映射声明的顺序调用过滤器。(所以是的-F1,F2,F3)是的,我知道了。但是现在我在问一个完全不同的场景,相同的url模式匹配到两个不同的servlet s1和s2。将调用哪个servlet?这个问题独立于筛选器。如果它是独立的,请问另一个问题;)(并在这一条上标记一个已接受的答案)好的,完成。你现在能发表评论吗?