Spring Boot如何在上下文根无尾斜杠时调用Controller方法
Spring Boot API 路由匹配问题
环境信息
- Spring Boot版本:
1.5.13.RELEASE - Spring Core版本:
4.3.17.RELEASE - 上下文根配置(application.properties):
server.context-path=/hoge
当前Controller配置
@RequestMapping(value = "/") public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); }
测试情况
- 可正常调用的curl命令:
curl http://localhost:8080/hoge/
- 无法调用的curl命令(不带尾斜杠):
curl http://localhost:8080/hoge
- 尝试修改
@RequestMapping为{"","/"},仍然无法匹配不带尾斜杠的请求。
已尝试的无效配置(附录)
ex1(无效)
@Controller @RequestMapping(value = "") public class TestAction { public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); } }
ex2(无效)
@Controller @RequestMapping(value = "*") public class TestAction { public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); } }
ex3(无效)
@Controller public class TestAction { @RequestMapping(value = "") public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); } }
ex4(无效)
@Controller public class TestAction { @RequestMapping(value = "*") public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); } }
解决方案
针对Spring Boot 1.5.x版本的这个问题,可通过以下方式解决:
方式一:配置全局尾部斜杠匹配
在application.properties中添加以下配置,让Spring MVC自动兼容带/不带尾斜杠的请求:
spring.mvc.pathmatch.trailing-slash=true spring.mvc.pathmatch.use-suffix-pattern=false
方式二:自定义WebMvc配置类
创建配置类覆盖默认路径匹配规则,全局启用尾斜杠兼容:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseTrailingSlashMatch(true); } }
方式三:显式映射双路径
在Controller方法上同时映射空路径和斜杠路径,确保覆盖两种请求形式:
@RequestMapping(value = {"", "/"}) public String default( HttpServletRequest request, HttpServletResponse response, SessionStatus sStatus, Model model, Locale locale) throws IOException, Exception { return login(request, response, sStatus, model, locale); }
注:需确保没有其他高优先级路由(如全局拦截器、其他Controller路由)覆盖该映射。
内容的提问来源于stack exchange,提问作者NaNash
相关产品推荐
相关产品推荐

