用途:

修改Spring MVC的URL映射控制路径匹配规则,达到满足业务要求

详述:

Spring MVC的URL映射有一个控制路径匹配的参数alwaysUseFullPath。默认值为false。
当它被设置为false后,总是使用当前servlet映射内的路径来查找Controller。
当它被设置为true后,总是使用当前servlet上下文中的全路径来查找Controller。
我希望,值为true。


当它被设置为false后(默认值)
servlet url-pattern= "/*"; request URI= "/test/a" 映射的Controller= "/test/a"
servlet url-pattern= "/"; request URI= "/test/a" 映射的Controller= "/test/a"
servlet url-pattern= "/*.do"; request URI= "/test/ a.do " 映射的Controller= "/test/a"
servlet url-pattern= "/test/*";request URI= "/test/a" 映射的Controller= "/a" (这里不满意)


当它被设置为true后
servlet url-pattern= "/test/*";request URI= "/test/a" 映射的Controller= "/test/a" (现在满意了)

我希望的是,当servlet拦截的是"/test/*" 路径时  ,浏览器访问/test/a 地址,被映射到 /test/a  Controller

配置:

在spring-context.xml配置文件中加入以下内容:

 <!-- 修改Spring MVC的URL映射控制路径匹配规则,达到满足业务要求 -->
 <bean class="com.sicheng.common.web.SpringStartupListener"></bean> 

如果系统有多个 Spring MVC 的DispatcherServlet容器(子容器),都会被影响


request.getServletPath()返回值的研究

问题描述,我在开发中遇到了以下现象,对我的开发工作造成了干扰。

  • request.getServletPath() 的返回值,受  <url-pattern>*.htm</url-pattern> 影响,返回不同结构的值

网上也有人遇到了同样的问题,比如这篇文章《request.getServletPath()返回为空的问题》 https://www.ktanx.com/blog/p/3551

为了全面分析,排除干扰,特证明了以下两点

  • contextPath 是变化对以上现象并不会产生影响
  • map.setAlwaysUseFullPath(true);  设置为true或false 对以上现象并不会产生影响

以下是测试的结果

========================= contextPath:/888 的测试=================================

----seller---
前提条件:
程序部署到tomcat时设置的 contextPath:/888 【这使用888】
<url-pattern>*.htm</url-pattern> 【这里使用的*.htm】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath():/seller/index.htm 【此时是正常的与我希望的一样】
request.getContextPath():/888
request.getQueryString():a=seller
request.getRequestURI():/888/seller/index.htm
request.getRequestURL().toString(): http://localhost:8080/888/seller/index.htm
request.getPathInfo():null 【此时这里是空,很常规】

----seller---
前提条件:
程序部署到tomcat时设置的 contextPath:/888 【这使用888】
<url-pattern>/seller/*</url-pattern> 【注意这是使用的是/seller/*】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath():/seller 【这是居然是/seller?反常阿】 【我的shop商城就是这种情况】
request.getContextPath():/888
request.getQueryString():a=seller
request.getRequestURI():/888/seller/index.htm        【 发现:/888/seller/index.htm  减去 /888 ,可得到正确的结果
request.getRequestURL().toString(): http://localhost:8080/888/seller/index.htm
request.getPathInfo():/index.htm 【这里居然非空?反常阿】

----seller---
前提条件:
程序部署到tomcat时设置的 contextPath:/888 【这使用888】
<url-pattern>/*</url-pattern> 【这里有改变,/seller/*变为了/*】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath(): 【这里居然是空?反常阿】
request.getContextPath():/888
request.getQueryString():a=seller
request.getRequestURI():/888/seller/index.htm
request.getRequestURL().toString(): http://localhost:8080/888/seller/index.htm
request.getPathInfo():/seller/index.htm 【这里居然非空?反常阿】

========================= contextPath:/ 的测试=================================

----seller---
前提条件:
程序部署到tomcat时设置的contextPath:/ 【这使用/】
<url-pattern>*.htm</url-pattern> 【这里使用的*.htm】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath():/seller/index.htm 【此时是正常的与我希望的一样】
request.getContextPath():
request.getQueryString():a=seller
request.getRequestURI():/seller/index.htm
request.getRequestURL().toString(): http://localhost:8080/seller/index.htm
request.getPathInfo():null 【此时这里是空,很常规】

----seller---
前提条件:
程序部署到tomcat时设置的contextPath:/ 【这使用/】
<url-pattern>/seller/*</url-pattern> 【注意这是使用的是/seller/*】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath():/seller 【这里居然是/seller?反常阿】
request.getContextPath():
request.getQueryString():a=seller
request.getRequestURI():/seller/index.htm
request.getRequestURL().toString(): http://localhost:8080/seller/index.htm
request.getPathInfo():/index.htm 【这里居然非空?反常阿】

----seller---
前提条件:
程序部署到tomcat时设置的contextPath:/ 【这使用/】
<url-pattern>/*</url-pattern> 【这里有改变,/seller/*变为了/*】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
request.getServletPath(): 【这里居然是空?反常阿】
request.getContextPath():
request.getQueryString():a=seller
request.getRequestURI():/seller/index.htm
request.getRequestURL().toString(): http://localhost:8080/seller/index.htm
request.getPathInfo():/seller/index.htm 【这里居然非空?反常阿】


----seller---
前提条件:
程序部署到tomcat时设置的contextPath:/ 【这使用/】
<url-pattern>*</url-pattern> 【这里有改变,/seller/*变为了*】
请求URL: http://localhost:8080/seller/index.htm?a=seller
结果:
启动报错
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [*] in servlet mapping

===========================================================================

----admin----
前提条件:
程序部署到tomcat时设置的 contextPath:/admin 【这使用/admin】
<url-pattern>*.do</url-pattern>
请求URL: http://localhost:8080/admin/index.do
结果:
request.getServletPath():/ index.do
request.getContextPath():/admin
request.getQueryString():null
request.getRequestURI():/admin/ index.do
request.getRequestURL().toString(): http://localhost:8080/admin/index.do
request.getPathInfo():null

===========================================================================