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 <url-pattern>/*</url-pattern>
中已经存在我们使用的过滤器。正是在这里,实际问题开始了。
如果<url-pattern>/*</url-pattern>
[它就像任何请求的通用接收器] 已经存在于 web.xml 中,那么该容器如何知道跟随 <url-pattern>/ABCXYZ</url-pattern>
而不是 <url-pattern>/*</url-pattern>
?请在这方面分享您的观点和知识。
【问题讨论】:
【参考方案1】: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 的映射。
网址模式匹配
如果您对链接不感兴趣,请从以下链接复制。
请查看URL Patterns,其中详细描述了示例。
【讨论】:
您的解释和给出的链接对我有帮助。以上是关于servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?的主要内容,如果未能解决你的问题,请参考以下文章