找回密码
 立即注册
首页 业界区 安全 记SpringBoot升级Tomcat引发的两类典型问题及解决方案 ...

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

锄淫鲷 前天 12:55
记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处理逻辑:
  1. 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;@Configurationpublic 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请求时,后端抛出如下异常:
  1. 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中添加配置:
  1. # 开启HiddenHttpMethodFilter过滤器,支持POST模拟DELETE/PUT请求spring.mvc.hiddenmethod.filter.enabled=true
复制代码
  1. spring:  mvc:    hiddenmethod:      filter:        enabled: true
复制代码
方案2:手动注册HiddenHttpMethodFilter(代码方式)

若配置文件方式不生效,可手动注册过滤器:
  1. import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.filter.HiddenHttpMethodFilter;@Configurationpublic class WebConfig {    @Bean    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {        return new HiddenHttpMethodFilter();    }}
复制代码
前端配合示例

前端需在POST表单中添加_method=DELETE隐藏参数:
  1.         删除用户
复制代码
补充说明


  • 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.enabled=true;
  • 版本升级前建议先做小范围验证,重点关注基础组件(如Tomcat)的行为变更,提前规避兼容性问题。
四、扩展建议


  • 建立URL规范检查机制:在前端工程中添加ESLint规则,禁止URL中出现连续斜杠;
  • 统一请求方式:新项目建议优先使用RESTful API+AJAX(Axios/Fetch),减少表单模拟DELETE/PUT的场景;
  • 版本兼容:升级依赖前查阅官方变更日志,重点关注核心组件(Tomcat、Spring框架)的行为变更点。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册