综述
目前微服务大行其道,各种中台应运而生,中台处理部分业务时需要透传请求,这就涉及到对url的处理。一般透传的接口都会保持path路径不变,因此需要从前端的url中提取公共部分。这就需要理解Context Path、servlet path、path info,目前servlet提供了对应的方法去方便获取它们。不过这3个到底对应url中的那一段,还是需要好好研究一下,不然很可能得到错误的url。
可以肯定的是 request uri = Context Path + servlet path + path info
Context Path
There is one context per “web application” per Java Virtual Machine. (A “web application” is a collection of servlets and content installed under a specific subset of the server’s URL namespace such as /catalog and possibly installed via a .war file.)
上述是tomcat中ServletContext类注释的一部分,文中表示Context代表一个app,对应以前一个war包或者一个spring boot开发的一个微服务。
- 如果是以前的war包,那么Context-Path就是以前war包解压后的目录名。
- 如果是现在流行的,使用spring boot开发的应用(内嵌tomcat)。那么Context-Path由配置项server.servlet.context-path决定。如果不配置的话,默认为空;那么
request uri=Context Path+servlet path+path info。
servlet path
url去掉Context Path后,剩余的部分用于匹配servlet。servlet的匹配规则可以通过如下方式进行匹配。
1、web.xml中的url-pattern指定(以前war包的模式)
<servlet-mapping>
<servlet-name>ceshiServlet</servlet-name>
<url-pattern>/ceshi/*</url-pattern>
</servlet-mapping>
2、通过java代码进行配置。
@Bean
public ServletRegistrationBean testdispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet,
"/ceshi/*");
registration.setName("ceshi");
return registration;
}
url-pattern的配置规则
匹配优先级如下所示:
- 通配符:只能以
"/*“结尾,比如”/ceshi/*";其他地方的“*”不会当做特殊字符处理 - 扩展名:只能是
*.xx,比如*.jsp - 默认匹配:servlet-url-pattern等于
“/” - 精确匹配:非上述场景,匹配的时候对比完整的url(剔除context-path余下的部分)。
上述匹配规则,可以直接通过tomcat源码得到印证:org.apache.catalina.mapper.Mapper#addWrapper(org.apache.catalina.mapper.Mapper.ContextVersion, java.lang.String, org.apache.catalina.Wrapper, boolean, boolean)
protected void addWrapper(ContextVersion context, String path,
Wrapper wrapper, boolean jspWildCard, boolean resourceOnly) {
synchronized (context) {
// 以 /* 结尾
if (path

本文探讨了在微服务背景下,理解Tomcat的Context Path、Servlet Path和Path Info的重要性。Context Path代表应用的URL命名空间,可以由war包名或Spring Boot的server.servlet.context-path配置确定。Servlet Path是匹配Servlet的URL部分,匹配规则包括精确匹配、通配符和扩展名匹配。文章还介绍了如何拆分Servlet Path和Path Info,以及它们在请求转发中的作用。
最低0.47元/天 解锁文章
3159

被折叠的 条评论
为什么被折叠?



