【问题标题】:Tomcat - How exactly context path matching works?Tomcat - 上下文路径匹配究竟是如何工作的?
【发布时间】:2016-08-13 02:56:53
【问题描述】:

假设我有两个 Spring webapps 部署到同一个 Tomcat 服务器实例:

答:

ROOT.war, context = /

@Controller
class TestController {

    @RequestMapping("/api/someMethod")
    public String someMethod() {
        //..
    }

    @RequestMapping("/api/v1/someMethod")
    public String someMethod() {
        //..
    }
}

乙:

api#v1.war, context = /api/v1/

@Controller
class TestController {

    @RequestMapping("/someMethod")
    public String someMethod() {
        //..
    }
}

将使用哪个 Web 应用程序来处理以下 HTTP 请求?

GET http://<hostname>/api/someMethod

GET http://<hostname>/api/v1/someMethod

GET http://<hostname>/api/v1/nonexistentMethod

如您所见,第二个 HTTP 请求匹配两个应用程序。我试图在Tomcat docs 中找到答案,但没有找到。在哪里指定上下文路径匹配的工作原理?

【问题讨论】:

    标签: java spring-mvc tomcat servlets jakarta-ee


    【解决方案1】:

    根据Servlet 3.0 Specification

    10.1 Web 服务器中的 Web 应用程序

    Web 应用程序植根于 Web 服务器中的特定路径。 例如,目录应用程序可能位于 http://www.mycorp.com/catalog。以此开头的所有请求 前缀将被路由到代表 目录应用程序。

    servlet 容器可以为 自动生成 Web 应用程序。例如 ~user/ 映射可用于映射到基于 /home/user/public_html/

    12.1 URL 路径的使用

    在收到客户端请求后,Web 容器会确定 要将其转发到的 Web 应用程序。 选择的 Web 应用程序 必须具有与开头匹配的最长上下文路径 请求网址。 URL 的匹配部分是上下文路径,当 映射到 servlet。 Web 容器接下来必须找到 servlet 使用描述的路径映射过程处理请求 以下。用于映射到 servlet 的路径是来自的请求 URL 请求对象减去上下文路径和路径参数。 下面的 URL 路径映射规则按顺序使用。 第一个 使用成功匹配,不再尝试匹配

    1. 容器将尝试查找请求路径与 servlet 路径的完全匹配。成功的匹配选择 小服务程序。

    2. 容器将递归地尝试匹配最长的路径预修复。这是通过在路径树中逐步降低一个目录来完成的 时间,使用'/'字符作为路径分隔符。最长的 match 确定选择的 servlet。

    3. 如果 URL 路径中的最后一段包含扩展名(例如 .jsp ),则 servlet 容器将尝试匹配 处理扩展请求。扩展定义为 最后一个 ' 之后的最后一段的一部分。 ’ 字符。

    4. 本规范 2.5 之前的版本使用这些映射技术作为建议而不是要求, 允许 servlet 容器各自有不同的方案 将客户端请求映射到 servlet。

    5. 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合 请求的资源。如果为 应用程序,它将被使用。许多容器提供了隐含的 提供内容的默认 servlet。

    Tomcat Request Process Flow 也可能有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-09
      • 2014-05-16
      • 2011-06-26
      • 2021-08-15
      • 2012-06-08
      • 2011-10-11
      • 2013-07-05
      • 1970-01-01
      相关资源
      最近更新 更多