servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?

Posted

技术标签:

【中文标题】servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?【英文标题】:How does a servlets filter identify next destination is another filter or a servlet/jsp? 【发布时间】:2014-07-05 02:31:07 【问题描述】:

我们通常会在 web.xml 中为 servlet 中的任何过滤器编写 <url-pattern>/*</url-pattern>

<filter-mapping>
    <filter-name>requestRedirectorFilter</filter-name>
    <url-pattern>/action</url-pattern>
</filter-mapping>`.  

现在我的疑问是 java 如何识别下一个 servlet/jsp 是什么?因为我们通过

提出的任何请求
request.getRequestDispatcher("/ABCXYZ").forward(request, (HttpServletResponse)servletResponse);

要导航到下一个 servlet/jsp,容器默认会在 web.xml 中搜索。在 web.xml &lt;url-pattern&gt;/*&lt;/url-pattern&gt; 中已经存在我们使用的过滤器。正是在这里,实际问题开始了。

如果&lt;url-pattern&gt;/*&lt;/url-pattern&gt; [它就像任何请求的通用接收器] 已经存在于 web.xml 中,那么该容器如何知道跟随 &lt;url-pattern&gt;/ABCXYZ&lt;/url-pattern&gt; 而不是 &lt;url-pattern&gt;/*&lt;/url-pattern&gt; ?请在这方面分享您的观点和知识。

【问题讨论】:

【参考方案1】:

Servlet 匹配过程

一个请求可以匹配给定上下文中的多个 servlet 映射。 servlet 容器使用简单的匹配过程来确定最佳匹配。

匹配过程有四个简单的规则。

首先,容器更喜欢精确路径匹配而不是通配符路径匹配。

其次,容器更喜欢匹配最长的模式

第三,容器更喜欢路径匹配而不是文件类型匹配。

最后,&lt;url-pattern&gt;/&lt;/url-pattern&gt; 模式总是匹配任何没有其他模式匹配的请求。


例如,上下文 web.xml 文件可以将在线目录的主页映射到一种模式,并将目录的搜索页面映射到不同的模式,如下所示:

<servlet-mapping>
  <servlet-name>catalogBrowse</servlet-name>
  <url-pattern>/Catalog/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>catalogSearch</servlet-name>
  <url-pattern>/Catalog/search/*</url-pattern>
</servlet-mapping>

下图说明了上下文的匹配过程。由于容器更喜欢匹配最长模式,因此包含/Catalog/search/ 的 URL 始终匹配 catalogSearch 的映射,而不是 catalogBrowse 的映射。

网址模式匹配


如果您对链接不感兴趣,请从以下链接复制。

请查看URL Patterns,其中详细描述了示例。

【讨论】:

您的解释和给出的链接对我有帮助。

以上是关于servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?的主要内容,如果未能解决你的问题,请参考以下文章

人脸识别下独一无二的你|机器视觉poe网卡

servlet 链过滤器

如何过滤不同的 url 以便与相同的 servlet 一起工作?

servlet过滤器

如何创建列表,其中字符串是另一个列表的一部分

Servlet过滤器