我有一个通过 Spring MVC 公开 REST API 的 Spring boot 应用程序。
当我使用嵌入式 tomcat 在本地运行我的应用程序时,我可以访问末尾带有斜杠的资源 - 例如 POST/resource/
但是,当我将 war 部署到一个独立的 tomcat 实例时,如果我在 URL 中包含尾部斜杠,我会得到一个 404,但如果没有尾部斜杠则成功 - 例如 POST/resource。
嵌入式 tomcat 可以使用或不使用尾部斜杠。
我的请求映射是
@RequestMapping(value = "/resource", method = RequestMethod.POST)
我尝试了各种配置选项,包括
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
matcher.setUseRegisteredSuffixPatternMatch(true);
matcher.setUseTrailingSlashMatch(true);
}
我能看到的唯一区别是嵌入式 tomcat 是 v8,独立版是 v7。两者运行完全相同的源代码但行为不同。
谁能建议如何解决这个问题?
谢谢
最佳答案
我能够解决这个问题。对于找到这篇文章的任何其他人...
出于某种原因,Tomcat 7 试图将带有尾部斜杠的请求映射到欢迎文件 (index.jsp)。如果请求包含尾部斜杠,它也不会识别端点,除非您专门为“/”设置请求映射,尽管 setUseTrailingSlashMatch 匹配为真。
此行为未反射(reflect)在我的嵌入式 tomcat (v8) 中。
我通过从 web.xml 中删除欢迎文件并将我的请求映射更新为:
解决了这个问题 @RequestMapping(value = {"/resource","/resource/"}, method = RequestMethod.POST)
关于Spring Boot 嵌入式 tomcat 的行为与独立行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681172/