记SpringBoot升级Tomcat引发的两类范例题目及办理方案 [复制链接]
发表于 2026-3-8 07:54:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
记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;
  2. import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
  3. import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class TomcatConfig {
  8.     @Bean
  9.     public ServletWebServerFactory servletWebServerFactory() {
  10.         TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
  11.         tomcat.addConnectorCustomizers((Connector connector) -> {
  12.             // 开启URL规范化,合并连续斜杠
  13.             connector.setNormalizeUri(true);
  14.             // Tomcat 9.x新增参数,允许路径中的连续斜杠
  15.             connector.setAttribute("allowBackSlash", true);
  16.             connector.setAttribute("normalizePath", true);
  17.         });
  18.         return tomcat;
  19.     }
  20. }
复制代码
二、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请求
  2. spring.mvc.hiddenmethod.filter.enabled=true
复制代码
  1. spring:
  2.   mvc:
  3.     hiddenmethod:
  4.       filter:
  5.         enabled: true
复制代码
方案2:手动注册HiddenHttpMethodFilter(代码方式)

若设置文件方式不见效,可手动注册过滤器:
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.filter.HiddenHttpMethodFilter;
  4. @Configuration
  5. public class WebConfig {
  6.     @Bean
  7.     public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
  8.         return new HiddenHttpMethodFilter();
  9.     }
  10. }
复制代码
前端共同示例

前端需在POST表单中添加_method=DELETE潜伏参数:
  1. <form action="/api/user/1" method="post">
  2.     <input type="hidden" name="_method" value="DELETE">
  3.     <button type="submit">删除用户</button>
  4. </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.enabled=true;
  • 版本升级前发起先做小范围验证,重点关注底子组件(如Tomcat)的举动变动,提前规避兼容性题目。
四、扩展发起


  • 创建URL规范查抄机制:在前端工程中添加ESLint规则,克制URL中出现一连斜杠;
  • 同一哀求方式:新项目发起优先使用RESTful API+AJAX(Axios/Fetch),淘汰表单模拟DELETE/PUT的场景;
  • 版本兼容:升级依靠前查阅官方变动日志,重点关注核心组件(Tomcat、Spring框架)的举动变动点。

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表