【问题标题】:How does a servlets filter identify next destination is another filter or a servlet/jsp?servlet 过滤器如何识别下一个目标是另一个过滤器还是 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; ?请在这方面分享您的观点和知识。

【问题讨论】:

    标签: java jsp servlet-filters


    【解决方案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,其中详细描述了示例。

    【讨论】:

    • 您的解释和给出的链接对我有帮助。
    猜你喜欢
    • 2011-11-30
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2011-07-03
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多