Tomcat - 上下文路径匹配的工作原理是什么?

时间:2016-04-20 12:21:24

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

假设我有两个Spring Web应用程序部署到同一个Tomcat服务器实例:

ROOT.war, context = /

@Controller
class TestController {

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

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

B:

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中找到答案,但没有找到答案。在哪里指定了上下文路径匹配的工作方式?

1 个答案:

答案 0 :(得分:1)

根据Servlet 3.0 Specification

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

  

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

     

servlet容器可以为其建立规则   自动生成Web应用程序。比如一个〜用户/   映射可用于映射到基于的Web应用程序   /家庭/用户/的public_html /

12.1使用网址路径

  

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

     
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择   的servlet。

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

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

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

  8.   
  9. 如果前三个规则都没有在servlet匹配中生成,则容器将尝试提供适合于   资源要求。如果&#34;默认&#34; servlet是为   应用程序,它将被使用。许多容器提供隐含的   用于提供内容的默认servlet。

  10.   

同样Tomcat Request Process Flow可能有用