記一次 springboot 參數解析 bug調試 HandlerMethodArgumentResolver


情況描述

前端輸入框輸入中文的橫線 —— ,到后台接收時變成了 &madsh;$mdash

正常應該顯示成這樣:

bug調試思路記錄

最開始完全沒有向調試源碼方面想,試了不少方法,都沒解決,沒辦法了只能源碼跟蹤排查問題。
想着那個類是解析參數的?加個斷點調試下就清除了,問題是不清楚到底是哪個類。so,search

開始
步驟1:搜索一下 : spring 參數解析
結果很多,看了很多博文之后,參考博客地址
發現了 HandlerMethodArgumentResolver

這里有兩個函數,其中resolveArgument是 負責解析request中的參數,賦給controller

//負責解析request中的參數,賦給controller
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;

步驟2:
HandlerMethodArgumentResolverCompositeresolveArgument處加斷點,開始跟蹤調試
這里很關鍵,千頭萬緒從這里開始,為什么是這里?參考的上邊的博文

斷點跟蹤情況:
(1)

(2)InvocableHandlerMethod

(3)

(4)

(5)

(6)

(7)

(8)

(9)

我們關注的是remark中的——,F6執行for循環,直接到remark

(10)

(11)

(12) 這一步,參數發生變化

(13)

(14)

附XSS攻擊介紹博文:XSS攻擊
(15)

(16)

以上步驟是最后總結出來的,第一遍調試不知道參數到哪里發生變化了,所以還有很多方法F5進入看了看,
跟着斷點一個方法一個方的過,最后發現在執行完這個方法后,原來的——變為了 &madsh

convertedValue = doConvertValue(oldValue, convertedValue, requiredType, editor);

總結

這個bug花了一上午才找出原因...
首先是剛剛接手對項目不熟悉,不知道BaseController中有 initBinder配置
再者也是不知從何入手調試,源碼調試經驗不足

花里胡哨各種搜索,試了n多方法,最后才知道誰才是爹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM