马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
记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.enabled=true
复制代码- spring:
- 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表单中添加_method=DELETE潜伏参数:- <form action="/api/user/1" method="post">
- <input type="hidden" name="_method" value="DELETE">
- <button type="submit">删除用户</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.enabled=true;
- 版本升级前发起先做小范围验证,重点关注底子组件(如Tomcat)的举动变动,提前规避兼容性题目。
四、扩展发起
- 创建URL规范查抄机制:在前端工程中添加ESLint规则,克制URL中出现一连斜杠;
- 同一哀求方式:新项目发起优先使用RESTful API+AJAX(Axios/Fetch),淘汰表单模拟DELETE/PUT的场景;
- 版本兼容:升级依靠前查阅官方变动日志,重点关注核心组件(Tomcat、Spring框架)的举动变动点。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |