最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot升級(jí)Tomcat引發(fā)的問題及解決方案

 更新時(shí)間:2026年03月11日 08:53:32   作者:蒙眼過河  
在SpringBoot項(xiàng)目維護(hù)過程中,版本升級(jí)是常見操作,但往往會(huì)引發(fā)一些兼容性問題,本文記錄了將SpringBoot內(nèi)置Tomcat從8.5.51升級(jí)到9.0.75后遇到的兩個(gè)典型問題,并給出對(duì)應(yīng)的解決方案和原理分析,需要的朋友可以參考下

在SpringBoot項(xiàng)目維護(hù)過程中,版本升級(jí)是常見操作,但往往會(huì)引發(fā)一些兼容性問題。本文記錄了將SpringBoot內(nèi)置Tomcat從8.5.51升級(jí)到9.0.75后遇到的兩個(gè)典型問題:URL包含雙斜杠//導(dǎo)致404、DELETE請(qǐng)求報(bào)HttpRequestMethodNotSupportedException,并給出對(duì)應(yīng)的解決方案和原理分析。

一、URL包含//導(dǎo)致404問題

問題現(xiàn)象

Tomcat版本升級(jí)至9.0.75后,前端點(diǎn)擊菜單出現(xiàn)404錯(cuò)誤,排查發(fā)現(xiàn)請(qǐng)求URL中存在連續(xù)的雙斜杠(如/api//user/list),將Tomcat回退到8.5.51后問題消失。

問題原因

Tomcat 9.x對(duì)URL的規(guī)范化處理邏輯相比8.x更嚴(yán)格:

  • Tomcat 8.5.51會(huì)自動(dòng)將URL中的連續(xù)斜杠//合并為單斜杠/,因此即使URL拼寫不規(guī)范也能正常訪問;
  • Tomcat 9.0.75默認(rèn)不再自動(dòng)合并連續(xù)斜杠,導(dǎo)致包含//的URL無法匹配后端接口,觸發(fā)404錯(cuò)誤。

解決方案

方案1:統(tǒng)一規(guī)范前端菜單URL配置(推薦)

從根源上解決問題,檢查并修正所有菜單、前端請(qǐng)求的URL配置,將所有連續(xù)的//替換為單斜杠/。
示例:

  • 錯(cuò)誤URL:/system//menu
  • 修正后:/system/menu

方案2:配置Tomcat允許合并連續(xù)斜杠(應(yīng)急方案)

若暫時(shí)無法批量修正URL,可通過配置Tomcat參數(shù)恢復(fù)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規(guī)范化,合并連續(xù)斜杠
            connector.setNormalizeUri(true);
            // Tomcat 9.x新增參數(shù),允許路徑中的連續(xù)斜杠
            connector.setAttribute("allowBackSlash", true);
            connector.setAttribute("normalizePath", true);
        });
        return tomcat;
    }
}

二、DELETE請(qǐng)求報(bào)HttpRequestMethodNotSupportedException異常

問題現(xiàn)象

前端發(fā)起DELETE請(qǐng)求時(shí),后端拋出如下異常:

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported

問題原因

瀏覽器原生只支持GET和POST請(qǐng)求,前端通常通過form表單+隱藏參數(shù)的方式模擬DELETE/PUT請(qǐng)求。SpringBoot中處理該場(chǎng)景的HiddenHttpMethodFilter過濾器默認(rèn)是關(guān)閉的(尤其是高版本SpringBoot),導(dǎo)致POST請(qǐng)求無法被轉(zhuǎn)換為DELETE請(qǐng)求,進(jìn)而觸發(fā)請(qǐng)求方法不支持的異常。

解決方案

方案1:開啟HiddenHttpMethodFilter(配置文件方式)

application.propertiesapplication.yml中添加配置:

# 開啟HiddenHttpMethodFilter過濾器,支持POST模擬DELETE/PUT請(qǐng)求
spring.mvc.hiddenmethod.filter.enabled=true
spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

方案2:手動(dòng)注冊(cè)HiddenHttpMethodFilter(代碼方式)

若配置文件方式不生效,可手動(dòng)注冊(cè)過濾器:

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隱藏參數(shù):

<form action="/api/user/1" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <button type="submit">刪除用戶</button>
</form>

補(bǔ)充說明

  1. HiddenHttpMethodFilter僅處理Content-Typeapplication/x-www-form-urlencoded的POST請(qǐng)求;
  2. 若前端使用Axios等AJAX工具,可直接設(shè)置method: 'DELETE',無需依賴該過濾器;
  3. 過濾器優(yōu)先級(jí):若項(xiàng)目中有自定義過濾器,需保證HiddenHttpMethodFilter執(zhí)行順序靠前。

三、總結(jié)

  1. Tomcat 9.x對(duì)URL規(guī)范化更嚴(yán)格,需統(tǒng)一規(guī)范URL拼寫(避免//),或通過配置恢復(fù)8.x的URL處理邏輯;
  2. SpringBoot中模擬DELETE/PUT請(qǐng)求需開啟HiddenHttpMethodFilter,核心配置為spring.mvc.hiddenmethod.filter.enabled=true
  3. 版本升級(jí)前建議先做小范圍驗(yàn)證,重點(diǎn)關(guān)注基礎(chǔ)組件(如Tomcat)的行為變更,提前規(guī)避兼容性問題。

四、擴(kuò)展建議

  1. 建立URL規(guī)范檢查機(jī)制:在前端工程中添加ESLint規(guī)則,禁止URL中出現(xiàn)連續(xù)斜杠;
  2. 統(tǒng)一請(qǐng)求方式:新項(xiàng)目建議優(yōu)先使用RESTful API+AJAX(Axios/Fetch),減少表單模擬DELETE/PUT的場(chǎng)景;
  3. 版本兼容:升級(jí)依賴前查閱官方變更日志,重點(diǎn)關(guān)注核心組件(Tomcat、Spring框架)的行為變更點(diǎn)。

以上就是SpringBoot升級(jí)Tomcat引發(fā)的問題及解決方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot升級(jí)Tomcat遇到的問題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot Rabbit MQ topic 配置文件綁定隊(duì)列和交換機(jī)的實(shí)現(xiàn)方法

    springboot Rabbit MQ topic 配置文件綁定隊(duì)列和交換機(jī)的

    本文詳細(xì)講解了在SpringBoot中使用RabbitMQ進(jìn)行隊(duì)列與交換機(jī)的綁定方法,包括創(chuàng)建交換機(jī)、隊(duì)列和綁定它們的步驟,以及如何發(fā)送和接收消息,適用于開發(fā)高并發(fā)系統(tǒng),如秒殺系統(tǒng)等
    2024-09-09
  • springboot通過SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)

    springboot通過SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)

    這篇文章主要介紹了springboot通過SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java進(jìn)階教程之運(yùn)行時(shí)類型識(shí)別RTTI機(jī)制

    Java進(jìn)階教程之運(yùn)行時(shí)類型識(shí)別RTTI機(jī)制

    這篇文章主要介紹了Java進(jìn)階教程之運(yùn)行時(shí)類型識(shí)別RTTI機(jī)制,在Java運(yùn)行時(shí),RTTI維護(hù)類的相關(guān)信息,比如多態(tài)(polymorphism)就是基于RTTI實(shí)現(xiàn)的,需要的朋友可以參考下
    2014-09-09
  • spring的13個(gè)經(jīng)典面試題

    spring的13個(gè)經(jīng)典面試題

    Spring框架是一個(gè)開放源代碼的J2EE應(yīng)用程序框架,是針對(duì)bean的生命周期進(jìn)行管理的輕量級(jí)容Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,我們這篇文章就來了解一下spring的面試題
    2021-06-06
  • springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理

    springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理

    這篇文章主要介紹了springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java消息隊(duì)列RabbitMQ入門詳解

    Java消息隊(duì)列RabbitMQ入門詳解

    這篇文章主要介紹了Java消息隊(duì)列RabbitMQ入門詳解,RabbitMQ是使用Erlang語言開發(fā)的開源消息隊(duì)列系統(tǒng),基于AMQP協(xié)議 來實(shí)現(xiàn),AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布 /訂閱)、可靠性、安全,需要的朋友可以參考下
    2023-07-07
  • 使用Spring的JAVA Mail支持簡(jiǎn)化郵件發(fā)送功能

    使用Spring的JAVA Mail支持簡(jiǎn)化郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了使用Spring的JAVA Mail支持簡(jiǎn)化郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java異常學(xué)習(xí)之自定義異常詳解

    Java異常學(xué)習(xí)之自定義異常詳解

    你的程序總有一天會(huì)崩潰掉,在崩潰掉的時(shí)候我們要知道它在哪,為了什么而崩潰掉,數(shù)據(jù)的保存或者丟失情況如何等問題。下面這篇文章主要給大家介紹了關(guān)于Java異常學(xué)習(xí)之自定義異常的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • SpringBoot整合Shiro的代碼詳解

    SpringBoot整合Shiro的代碼詳解

    shiro是一個(gè)權(quán)限框架,它提供了很方便的權(quán)限認(rèn)證和登錄的功能.下面通過本文給大家分享SpringBoot整合Shiro的代碼詳解,需要的的朋友參考下吧
    2017-08-08
  • 如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制?

    如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制?

    這篇文章主要介紹了如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

湄潭县| 冷水江市| 烟台市| 新蔡县| 娄烦县| 阜新| 四子王旗| 竹北市| 保靖县| 当雄县| 罗山县| 永清县| 福安市| 博客| 牙克石市| 青州市| 光山县| 封开县| 瓦房店市| 宜昌市| 赣榆县| 德兴市| 罗田县| 东光县| 集安市| 阿拉善右旗| 黄平县| 洛浦县| 萝北县| 呼玛县| 根河市| 玛曲县| 铁力市| 邵武市| 建平县| 塔河县| 丰宁| 阿鲁科尔沁旗| 福州市| 沧州市| 电白县|