综述
目前微服务大行其道,各种中台应运而生,中台处理部分业务时需要透传请求,这就涉及到对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) {