Spring Boot 嵌入式 tomcat 的行为与独立行为不同

标签 spring spring-mvc tomcat spring-boot

我有一个通过 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/

相关文章:

java - JBOSS - Previos 定时器的执行仍在进行中,定时器状态为 IN_TIMEOUT

spring - Spring 的 @RequestBody byte[](长度大于预期)有什么问题?

java - 在 Java Spring 中将一个 bean 的值设置为另一个 bean

java - 使用@PathVariable将参数传递给Spring Controller

Apache Tomcat 启动错误 : SEVERE: Error deploying web application directory

ajax - TemplateInputException : Error resolving template ****, 模板可能不存在

java - Spring Security 中的 AuthenticationSuccessHandler

java - 将多部分文件从 Controller 发送到 JSP (Spring)

javascript - 2 张具有相同 src 的图像,一张渲染,一张不渲染。如何?

java - Jdbc和Tomcat疑似内存泄漏