Spring MVC的GET与POST请求url-pattern坑

Spring MVC的GET与POST请求url-pattern坑

一、坑现象复现

1、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>smvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>smvc</servlet-name>
        <url-pattern>/prefix/*</url-pattern>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

2、Controller

@Controller
public class TestController {

    @RequestMapping(value = "/test/a.do")
    @ResponseBody
    public String getA(){
       
        return "AA";
    }

    @RequestMapping(value = "/prefix/b.do")
    @ResponseBody
    public String getB(){
       
        return "BB";
    }

} 

3、请求情况

get/post方式请求url:/test/a.do,返回AA

get/post方式请求url:/prefix/b.do,返回错误码405

get/post方式请求url:/prefix/prefix/b.do,返回BB

二、请求不同的原因

Spring MVC的MethodHandler根据Controller的method解析生成url,而Spring MVC将请求URL在URL拦截解析过程中除去web.xml映射的前缀,剩下url串进行MethodHandler匹配,所以get/post请求无法在前缀模式url匹配到MethodHandler进行访问。