SpringBoot升级Tomcat引发的问题及解决方案

 更新时间:2026年03月11日 08:53:32   作者:蒙眼过河  
在SpringBoot项目维护过程中,版本升级是常见操作,但往往会引发一些兼容性问题,本文记录了将SpringBoot内置Tomcat从8.5.51升级到9.0.75后遇到的两个典型问题,并给出对应的解决方案和原理分析,需要的朋友可以参考下

在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.propertiesapplication.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>

补充说明

  1. HiddenHttpMethodFilter仅处理Content-Typeapplication/x-www-form-urlencoded的POST请求;
  2. 若前端使用Axios等AJAX工具,可直接设置method: 'DELETE',无需依赖该过滤器;
  3. 过滤器优先级:若项目中有自定义过滤器,需保证HiddenHttpMethodFilter执行顺序靠前。

三、总结

  1. Tomcat 9.x对URL规范化更严格,需统一规范URL拼写(避免//),或通过配置恢复8.x的URL处理逻辑;
  2. SpringBoot中模拟DELETE/PUT请求需开启HiddenHttpMethodFilter,核心配置为spring.mvc.hiddenmethod.filter.enabled=true
  3. 版本升级前建议先做小范围验证,重点关注基础组件(如Tomcat)的行为变更,提前规避兼容性问题。

四、扩展建议

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

以上就是SpringBoot升级Tomcat引发的问题及解决方案的详细内容,更多关于SpringBoot升级Tomcat遇到的问题的资料请关注脚本之家其它相关文章!

相关文章

  • springboot Rabbit MQ topic 配置文件绑定队列和交换机的实现方法

    springboot Rabbit MQ topic 配置文件绑定队列和交换机的

    本文详细讲解了在SpringBoot中使用RabbitMQ进行队列与交换机的绑定方法,包括创建交换机、队列和绑定它们的步骤,以及如何发送和接收消息,适用于开发高并发系统,如秒杀系统等
    2024-09-09
  • springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    这篇文章主要介绍了springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java进阶教程之运行时类型识别RTTI机制

    Java进阶教程之运行时类型识别RTTI机制

    这篇文章主要介绍了Java进阶教程之运行时类型识别RTTI机制,在Java运行时,RTTI维护类的相关信息,比如多态(polymorphism)就是基于RTTI实现的,需要的朋友可以参考下
    2014-09-09
  • spring的13个经典面试题

    spring的13个经典面试题

    Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容Spring解决了开发者在J2EE开发中遇到的许多常见的问题,我们这篇文章就来了解一下spring的面试题
    2021-06-06
  • springmvc接口接收参数与请求参数格式的整理

    springmvc接口接收参数与请求参数格式的整理

    这篇文章主要介绍了springmvc接口接收参数与请求参数格式的整理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java消息队列RabbitMQ入门详解

    Java消息队列RabbitMQ入门详解

    这篇文章主要介绍了Java消息队列RabbitMQ入门详解,RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议 来实现,AMQP的主要特征是面向消息、队列、路由(包括点对点和发布 /订阅)、可靠性、安全,需要的朋友可以参考下
    2023-07-07
  • 使用Spring的JAVA Mail支持简化邮件发送功能

    使用Spring的JAVA Mail支持简化邮件发送功能

    这篇文章主要为大家详细介绍了使用Spring的JAVA Mail支持简化邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Java异常学习之自定义异常详解

    Java异常学习之自定义异常详解

    你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。下面这篇文章主要给大家介绍了关于Java异常学习之自定义异常的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • SpringBoot整合Shiro的代码详解

    SpringBoot整合Shiro的代码详解

    shiro是一个权限框架,它提供了很方便的权限认证和登录的功能.下面通过本文给大家分享SpringBoot整合Shiro的代码详解,需要的的朋友参考下吧
    2017-08-08
  • 如何实现广告弹窗触达频率的控制?

    如何实现广告弹窗触达频率的控制?

    这篇文章主要介绍了如何实现广告弹窗触达频率的控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论