假设我有两个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中找到答案,但没有找到答案。在哪里指定了上下文路径匹配的工作方式?
答案 0 :(得分:1)
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路径映射规则按顺序使用。 第一个 成功匹配用于未尝试进一步匹配:
容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择 的servlet。
容器将递归尝试制作最长的路径预修复。这是通过在路径树中逐步降低目录来完成的 时间,使用'/'字符作为路径分隔符。最长的 match确定所选的servlet。
如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配一个servlet 处理扩展请求。扩展名定义为 最后一段之后的一部分。 'character。
2.5之前的本规范的版本使用这些映射技术作为建议而不是要求, 允许每个servlet容器都有不同的方案 将客户端请求映射到servlet。
- 醇>
如果前三个规则都没有在servlet匹配中生成,则容器将尝试提供适合于 资源要求。如果&#34;默认&#34; servlet是为 应用程序,它将被使用。许多容器提供隐含的 用于提供内容的默认servlet。