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

时间:2014-05-16 15:06:42

标签: java jsp servlet-filters

我们通常最终会在web.xml中为servlet中的任何Filter编写<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 <url-pattern>/*</url-pattern>已经存在我们使用的过滤器。正是这里的实际问题才开始。

如果<url-pattern>/*</url-pattern> [对任何请求充当通用接收器]已经存在于web.xml中,那么heck容器如何知道如何跟随<url-pattern>/ABCXYZ</url-pattern>而不是<url-pattern>/*</url-pattern>?请在此方面分享您的观点和知识。

1 个答案:

答案 0 :(得分:2)

Servlet匹配程序

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

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

  • 首先,容器优先于通配符路径匹配精确路径匹配

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

  • 第三,容器首选路径匹配文件类型匹配。

  • 最后,模式<url-pattern>/</url-pattern>始终匹配任何其他模式不匹配的请求。


例如,上下文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的映射匹配。

网址格式匹配

enter image description here


如果您不想转到该链接,则会从以下链接中复制。

请查看URL Patterns,其中详细介绍了示例。