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

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

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

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

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

問(wèn)題現(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后問(wèn)題消失。

問(wèn)題原因

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

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

解決方案

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

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

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

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

若暫時(shí)無(wú)法批量修正URL,可通過(guò)配置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異常

問(wèn)題現(xiàn)象

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

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

問(wèn)題原因

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

解決方案

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

application.propertiesapplication.yml中添加配置:

# 開啟HiddenHttpMethodFilter過(guò)濾器,支持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è)過(guò)濾器:

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ǔ)充說(shuō)明

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

三、總結(jié)

  1. Tomcat 9.x對(duì)URL規(guī)范化更嚴(yán)格,需統(tǒng)一規(guī)范URL拼寫(避免//),或通過(guò)配置恢復(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ī)避兼容性問(wèn)題。

四、擴(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ā)的問(wèn)題及解決方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot升級(jí)Tomcat遇到的問(wèn)題的資料請(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通過(guò)SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)

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

    這篇文章主要介紹了springboot通過(guò)SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期,本文通過(guò)實(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ā)中遇到的許多常見的問(wèn)題,我們這篇文章就來(lái)了解一下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語(yǔ)言開發(fā)的開源消息隊(duì)列系統(tǒng),基于AMQP協(xié)議 來(lái)實(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ù)的保存或者丟失情況如何等問(wèn)題。下面這篇文章主要給大家介紹了關(guān)于Java異常學(xué)習(xí)之自定義異常的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • SpringBoot整合Shiro的代碼詳解

    SpringBoot整合Shiro的代碼詳解

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

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

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

最新評(píng)論

临高县| 深圳市| 兴安盟| 凌云县| 石阡县| 罗城| 郧西县| 齐河县| 鄂托克旗| 双柏县| 余江县| 乳源| 简阳市| 慈溪市| 东山县| 连江县| 水城县| 江达县| 中牟县| 万山特区| 北流市| 松滋市| 桦南县| 宝山区| 临漳县| 雷波县| 墨竹工卡县| 福建省| 吕梁市| 常熟市| 白城市| 宁明县| 陈巴尔虎旗| 水城县| 武邑县| 简阳市| 镇平县| 宁强县| 福鼎市| 山东省| 平罗县|