国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot升級過程中踩坑定位分析記錄 | 京東云技術團隊

這篇具有很好參考價值的文章主要介紹了springboot升級過程中踩坑定位分析記錄 | 京東云技術團隊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者:京東零售?李文龍

1.背景

俗話說:為了修復一個小bug而引入了一個更大bug

因所負責的系統(tǒng)使用的spring框架版本5.1.5.RELEASE在線上出過一個偶發(fā)的小事故,最后定位為spring-context中的一個bug導致的。

為了修復此bug進行了spring版本的升級,最終定的版本為收銀臺團隊使用的版本5.2.12.RELEASE,對應的springboot版本為2.2.12.RELEASE。

選擇這個版本的原因是:

1.有團隊經(jīng)過了長時間的線上驗證

2.修復了5.1.5.RELEASE對應的bug

2.升級上線

升級相關版本后在預發(fā)環(huán)境進行了驗證,暫未遇到關于框架的問題。本以為安全升級完成,在上線過程中發(fā)現(xiàn)在APP中無法訪問,此時還未掛載流量。

日志中分析是某些參數(shù)未解析到,后在nginx日志中查到相關請求,使用postman模擬請求可以正常使用。

3.分析驗證定位原因

1.臨時修復

在代碼一致的情況下,唯一的可能就只能是線上與預發(fā)配置不同,經(jīng)對比分析得出是某個過濾器的順序在線上未配置,按照預發(fā)的配置后可正常使用。我們暫且稱修改的這兩個過濾器為MA,

其中默認情況下執(zhí)行順序為M->A,順序修改為A->M后正常,其兩者作用大致為:

M : 通用過濾器,解析url中的參數(shù)至parameterMap中,并初始化讀取了body中的inputstream進行了byte數(shù)組的緩存,用于解決重復讀取流問題 A: 特定處理器,先是查詢parameter中的參數(shù),然后邏輯處理后再設置一些特殊參數(shù)。

2.為何需要改過濾器順序

經(jīng)查未升級前過濾器的順序與升級后過濾器順序一致,為何升級spring框架后需要修改配置。此時猜測可能是spring在升級過程中修改了一部分代碼,

但未有頭緒,只能先調(diào)轉(zhuǎn)方向分析為什么postman和瀏覽器中的swagger可以正常使用

3.分析nginx日志

前端請求與postman請求的nginx日志進行了分析得出了原因,對比日志如下:

postman POST /shop/bpaas/floor?client&clientVersion&ip=111.202.149.19&gfid=getShopMainFloor&body= 前端 : POST /shop/bpaas/floor HTTP/1.0" 200 634 "-" "api" "0.94" 0.008 0.007 client&clientVersion&ip=111.202.149.17&gfid=getShopMainFloor&body=

經(jīng)過以上對比發(fā)現(xiàn)雖然postman使用了post請求,但數(shù)據(jù)還是放置在url中,在經(jīng)過系統(tǒng)的一個內(nèi)置過濾器M時將url中的參數(shù)解析到了parameterMap中,后續(xù)過濾器可以使用

request.getParameter獲取到,注意此方法是解決問題的關鍵,此時還未意識到。

4.升級前后框架是否有大的修改

因升級的版本是升級了一個小版本號,所以不好對比升級的buglist,只能慢慢進行分析,后在分析過濾器時發(fā)現(xiàn)升級spring后過濾器個數(shù)由11個減少到了10個,減少了那一個為:

org.springframework.web.filter.HiddenHttpMethodFilter

此過慮器的作用是在瀏覽器不支持PUT、DELETE、PATCH等method時,可以在form表單中使用隱藏的_method參數(shù)支持這幾種method。好像跟參數(shù)解析沒有任何關系,

繼續(xù)分析升級版本中 (由2.1.3.RELEASE->2.2.12.RELEASE)是否修改了此過濾器的一些內(nèi)容,后在2.2.0.M5的release notes中發(fā)現(xiàn)HiddenHttpMethodFilter相關的:

Disable auto-configuration of HiddenHttpMethodFilter by default github上對應的版本release notes: https://github.com/spring-projects/spring-boot/releases/tag/v2.2.0.M5

也就是說升級后HiddenHttpMethodFilter默認配置由enable修改為了disable,如果再修改回去是不是可以修復參數(shù)解析的問題呢?

5.添加過濾器enable配置

因bug修復列表中有對應的issues,所以找到了此過濾器對應的配置:

-Dspring.mvc.hiddenmethod.filter.enabled=true

添加后可以正常使用,證明是此過濾器中在某種條件下不可缺少。

6.未升級spring版本時disable驗證

在確認未升級版本的spring支持此參數(shù)的情況下,添加了以上參數(shù),將默認的啟動修改成了禁用,經(jīng)驗證:在不代碼修改的情況下,無此過濾器時參數(shù)無法解析。證明了上步的猜測。

7.深入源碼分析

此時需要分析HiddenHttpMethodFilter過濾器中是否有特殊操作,源碼如下:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		HttpServletRequest requestToUse = request;

		if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
			String paramValue = request.getParameter(this.methodParam);
			if (StringUtils.hasLength(paramValue)) {
				String method = paramValue.toUpperCase(Locale.ENGLISH);
				if (ALLOWED_METHODS.contains(method)) {
					requestToUse = new HttpMethodRequestWrapper(request, method);
				}
			}
		}

		filterChain.doFilter(requestToUse, response);
	}

分析以上源碼可以發(fā)現(xiàn),有且只有一種可能,就是request.getParameter可能是解決問題的是關鍵。

8.大膽猜測

分析后源碼猜測,第一步中的修改順序有可能是A中有調(diào)用getParameter,所以順序調(diào)整為A->M后,相當于間接使用了HiddenHttpMethodFilter。

9.開始驗證

在不使用HiddenHttpMethodFilter的情況下,如果在過濾器原有順序不修改的情況下,只要在M執(zhí)行前調(diào)用了request.getParameter,理論上可以正常為使用。所以在debug情況下

利用工具在M過濾器調(diào)用前先行執(zhí)行request.getParameter,發(fā)現(xiàn)的確可以正常使用。

10.分析過濾器

先前簡述了M的功能,主要是包裝了request,后讀源碼時發(fā)現(xiàn),如果是post請求,讀取body體中的數(shù)據(jù)后并未解析body中的參數(shù)至parameterMap中,而代碼中的其它過濾器都是

通過request.getParameter獲取的數(shù)據(jù),重寫后的代碼:

public String getParameter(String name) {
		if ( this.parameterMap.containsKey(name) )
			return this.parameterMap.get(name);
		else {
			return super.getParameter(name);
		}
	}

在經(jīng)過request包裝后,先是從paremeterMap中獲取數(shù)據(jù),此時map肯定是沒有數(shù)據(jù),只能從父類獲取,而父類獲取時會解析parameter,解析時使用到了inputStream,但M過濾器

的在初始化時解析了輸入流,此時tomcat內(nèi)部使用內(nèi)部的request獲取stream時將獲取到空數(shù)據(jù),即無法從parameter中獲取到body體中的數(shù)據(jù)。

而如果在調(diào)用M前調(diào)用了request.getParameter,tomcat內(nèi)部將提前于M解析parameter,可以保證后續(xù)可獲取到相關參數(shù)。

4. 修復方案

既然得出了結(jié)論,那么升級spring版本后修復此bug可選擇的方案就比較多了,主要有:

  1. 啟用HiddenHttpMethodFilter,添加對應的參數(shù),保證升級前后過濾器個數(shù)與順序一致

  2. 調(diào)整理過濾器A與M的順序,保證M在A之前執(zhí)行即可。

  3. 修改過濾器M內(nèi)部的邏輯,不在初始化的時候解析body,或是在解析body后將參數(shù)重新放置到parameterMap中。

此文是筆者按照分析流程進行簡單驗證,分析驗證過程中難免有遺漏之處,如有錯誤遺漏還煩請各位指出共同進步。文章來源地址http://www.zghlxwxcb.cn/news/detail-428020.html

到了這里,關于springboot升級過程中踩坑定位分析記錄 | 京東云技術團隊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Tensorflow訓練代碼1.x接口自動升級2.x踩坑記錄

    Tensorflow訓練代碼1.x接口自動升級2.x踩坑記錄

    一起學AI系列博客:目錄索引 本文小結(jié)Tensorflow訓練代碼1.x接口自動升級2.x踩坑過程和問題解決的方法。 Tensorflow環(huán)境準備 前提已安裝好Anaconda/Spyder/Tensorflow,步驟略 從spyder進入tensorflow環(huán)境,具體方法見:link 核心步驟: Anaconda prompt命令窗下: activate tensorflow Spyder Spyder界面右

    2024年02月09日
    瀏覽(18)
  • ElasticSearch|ES 連接超時及創(chuàng)建連接失敗問題定位過程記錄

    socket.timeout:等待源端服務器響應超時 ConnectionRefusedError:嘗試創(chuàng)建連接被拒絕 ES 集群中某個節(jié)點的 ES 主進程被殺(由于服務器內(nèi)存不足導致),導致該節(jié)點 ES 重新拉起,報 “嘗試創(chuàng)建連接被拒絕”; ES 集群中某個節(jié)點的服務器內(nèi)存不足,導致該節(jié)點 ES 的 cache 被清空,E

    2024年02月04日
    瀏覽(31)
  • SpringBoot2.7升級項目到Springboot3.1踩坑指南(jdk17/jdk21)

    由于SpringBoot3.x全面擁抱JDK17,兼容jdk21,jdk17乃是大勢所趨。這里是從SpringBoot2.7--SpringBoot3.1踩坑指南。 提前閱讀:jdk8升級JDK17避坑指南(適用于SpringBoot2.3—SpringBoot2.7升級) 國內(nèi)頂級開源項目升級到springBoot3情況,可以作為升級SpringBoot3的風向標。僅對比國內(nèi)規(guī)模使用,落地過

    2024年03月09日
    瀏覽(28)
  • jdk17+springboot使用webservice,踩坑記錄

    這幾天wms對接lbpm系統(tǒng),給我的接口是webservice的,老實說,這個技術很早,奈何人家只支持這個。 環(huán)境說明:JDK17 springboot2.6.6。網(wǎng)上很多教程是基于jdk8的,所以很多在17上面跑不起來。折騰兩天,直接給答案。 因為springboot版本不是3.0,用不了 cxf-spring-boot-starter-jaxws 的 4 版本

    2024年02月02日
    瀏覽(24)
  • CentOS系統(tǒng)下升級Python的openssl過程記錄

    CentOS系統(tǒng)下升級Python的openssl過程記錄

    問題:運行一個軟件提示openssl版本過低。報錯:“ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with ‘OpenSSL 1.0.2k-fips 26 Jan 2017’. See: https://github.com/urllib3/urllib3/issues/2168” 嘗試解決1:通過ChatGPT提問獲得解決辦法 既然你使用的是 CentOS 系統(tǒng),我們將

    2024年01月16日
    瀏覽(25)
  • vue3+vite+ts項目集成科大訊飛語音識別(項目搭建過程以及踩坑記錄)

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:前端領域新星創(chuàng)作者、阿里云專家博主,專注于前端各領域技術,共同學習共同進步,一起加油呀! ??系列專欄:vue3從入門到精通、TypeScript從入門到實踐 ?? 資料領?。呵岸诉M階資料以及文中源碼可以找我免費領取 ?? 前端

    2023年04月09日
    瀏覽(42)
  • SpringBoot中整合ElasticSearch快速入門以及踩坑記錄

    SpringBoot中整合ElasticSearch快速入門以及踩坑記錄

    若依前后端分離版手把手教你本地搭建環(huán)境并運行項目: 若依前后端分離版手把手教你本地搭建環(huán)境并運行項目_本地運行若依前后端分離-CSDN博客 參考上面搭建項目。 Elasticsearch 是java開發(fā)的,基于 Lucene 的搜索引擎。它提供了一個分布式多用戶能力的全文搜索引擎,基于R

    2024年01月17日
    瀏覽(20)
  • Docker安裝最新穩(wěn)定版Nginx(分析版本選擇問題和分享踩坑過程)

    Docker安裝最新穩(wěn)定版Nginx(分析版本選擇問題和分享踩坑過程)

    ?? Nginx官方安裝包下載地址: ??http://nginx.org/en/download.html ? ?? Docker Hub官方網(wǎng)址: ??https://hub.docker.com/ ? ??如果需要了解Centos7下Docker的安裝部署,可參考教程【最新Docker在Centos7下安裝部署(參考官方教程文檔)】。 ? ??拉取Nginx Docker版鏡像的最簡單的命令是

    2023年04月13日
    瀏覽(16)
  • Mysql5.7大限將至升級Mysql 8.0過程記錄(未完)

    Mysql5.7大限將至升級Mysql 8.0過程記錄(未完)

    時間很快,到2023年10月底,MySQL 5.7就到了它的EOL(End of Life),屆時將不會提供任何補丁,無法應對潛在的安全風險;是時候和 MySQL 5.7 說再見了?。。?!回顧自Mysql5.7 版本2015年10月發(fā)布,它帶來很多新的特性,比如:默認引擎改成了InnoDB,更新了安全策略,性能方面的提升,

    2024年01月21日
    瀏覽(25)
  • 記錄Chrome插件從V2版本升級到V3版本的過程中遇到的問題

    記錄Chrome插件從V2版本升級到V3版本的過程中遇到的問題

    總結(jié)一下自己在把Chrome V2版本的插件升級到V3版本的過程中,遇到的一些問題,之前也有發(fā)布一章V3版本的manifest.json配置項參數(shù)說明,基本也涵蓋了下面提到的幾個配置項的改動,傳送門 總結(jié)分了兩大塊,一塊是manifest配置文件V2和V3有哪幾個配置項不同,一塊是升級過程遇到

    2023年04月08日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包