记SpringBoot升级Tomcat引发的两类典型问题及解决方案

张开发
2026/4/3 16:20:42 15 分钟阅读
记SpringBoot升级Tomcat引发的两类典型问题及解决方案
在SpringBoot项目维护过程中版本升级是常见操作但往往会引发一些兼容性问题。本文记录了将SpringBoot内置Tomcat从8.5.51升级到9.0.75后遇到的两个典型问题URL包含双斜杠//导致404、DELETE请求报HttpRequestMethodNotSupportedException并给出对应的解决方案和原理分析。一、URL包含//导致404问题问题现象Tomcat版本升级至9.0.75后前端点击菜单出现404错误排查发现请求URL中存在连续的双斜杠如/api//user/list将Tomcat回退到8.5.51后问题消失。问题原因Tomcat 9.x对URL的规范化处理逻辑相比8.x更严格Tomcat 8.5.51会自动将URL中的连续斜杠//合并为单斜杠/因此即使URL拼写不规范也能正常访问Tomcat 9.0.75默认不再自动合并连续斜杠导致包含//的URL无法匹配后端接口触发404错误。解决方案方案1统一规范前端菜单URL配置推荐从根源上解决问题检查并修正所有菜单、前端请求的URL配置将所有连续的//替换为单斜杠/。示例错误URL/system//menu修正后/system/menu方案2配置Tomcat允许合并连续斜杠应急方案若暂时无法批量修正URL可通过配置Tomcat参数恢复8.x的URL处理逻辑import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class TomcatConfig { Bean public ServletWebServerFactory servletWebServerFactory() { TomcatServletWebServerFactory tomcat new TomcatServletWebServerFactory(); tomcat.addConnectorCustomizers((Connector connector) - { // 开启URL规范化合并连续斜杠 connector.setNormalizeUri(true); // Tomcat 9.x新增参数允许路径中的连续斜杠 connector.setAttribute(allowBackSlash, true); connector.setAttribute(normalizePath, true); }); return tomcat; } }二、DELETE请求报HttpRequestMethodNotSupportedException异常问题现象前端发起DELETE请求时后端抛出如下异常org.springframework.web.HttpRequestMethodNotSupportedException: Request method POST not supported问题原因浏览器原生只支持GET和POST请求前端通常通过form表单隐藏参数的方式模拟DELETE/PUT请求。SpringBoot中处理该场景的HiddenHttpMethodFilter过滤器默认是关闭的尤其是高版本SpringBoot导致POST请求无法被转换为DELETE请求进而触发请求方法不支持的异常。解决方案方案1开启HiddenHttpMethodFilter配置文件方式在application.properties或application.yml中添加配置# 开启HiddenHttpMethodFilter过滤器支持POST模拟DELETE/PUT请求 spring.mvc.hiddenmethod.filter.enabledtruespring: mvc: hiddenmethod: filter: enabled: true方案2手动注册HiddenHttpMethodFilter代码方式若配置文件方式不生效可手动注册过滤器import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.HiddenHttpMethodFilter; Configuration public class WebConfig { Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new HiddenHttpMethodFilter(); } }前端配合示例前端需在POST表单中添加_methodDELETE隐藏参数form action/api/user/1 methodpost input typehidden name_method valueDELETE button typesubmit删除用户/button /form补充说明HiddenHttpMethodFilter仅处理Content-Type为application/x-www-form-urlencoded的POST请求若前端使用Axios等AJAX工具可直接设置method: DELETE无需依赖该过滤器过滤器优先级若项目中有自定义过滤器需保证HiddenHttpMethodFilter执行顺序靠前。三、总结Tomcat 9.x对URL规范化更严格需统一规范URL拼写避免//或通过配置恢复8.x的URL处理逻辑SpringBoot中模拟DELETE/PUT请求需开启HiddenHttpMethodFilter核心配置为spring.mvc.hiddenmethod.filter.enabledtrue版本升级前建议先做小范围验证重点关注基础组件如Tomcat的行为变更提前规避兼容性问题。四、扩展建议建立URL规范检查机制在前端工程中添加ESLint规则禁止URL中出现连续斜杠统一请求方式新项目建议优先使用RESTful APIAJAXAxios/Fetch减少表单模拟DELETE/PUT的场景版本兼容升级依赖前查阅官方变更日志重点关注核心组件Tomcat、Spring框架的行为变更点。

更多文章