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

发布于 2024-12-12 21:28:18 字数 568 浏览 0 评论 0原文

假设我的 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 形式出现,则调用过滤器的顺序是什么?为什么?

Suppose I have following in my 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>

What will be the order in which the filters will be called if a request comes as /XYZ/abc.do and why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤蝉 2024-12-19 21:28:18

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

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

In the order their mappings are defined in web.xml

If using annotations (@WebFilter) the order seems to be undefined - you still have to declare the <filter-mapping> entries in web.xml.

此刻的回忆 2024-12-19 21:28:18

Servlet 规范 3.0

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

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

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

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

如果过滤器映射同时包含 ,则容器必须将过滤器映射扩展为多个过滤器映射(一个对于每个 ),保留 的顺序 元素。

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

Section 6.2.4 of the Servlet specification 3.0:

When processing a <filter-mapping> element using the <url-pattern> style, the container must determine whether the <url-pattern> matches the request URI using the path mapping rules defined in Chapter 12, “Mapping Requests to Servlets”.

The order the container uses in building the chain of filters to be applied for a particular request URI is as follows:

  1. First, the <url-pattern> matching filter mappings in the same order that these elements appear in the deployment descriptor.

  2. Next, the <servlet-name> matching filter mappings in the same order that these elements appear in the deployment descriptor.

If a filter mapping contains both <servlet-name> and <url-pattern>, the container must expand the filter mapping into multiple filter mappings (one for each <servlet-name> and <url-pattern>), preserving the order of the <servlet-name> and <url-pattern> elements.

In short: they're applied in the order in which they appear in the XML file. It gets interesting if you hit an URL that's covered by both <url-pattern> and <servlet-name> bound filters, because then all URL-pattern bound filters are applied before all servlet-name bound filters. I've never been in this situation (haven't seen any servlet-name bound filters at all), but I reckon it could be quite confusing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文