情況描述
前端輸入框輸入中文的橫線 ——
,到后台接收時變成了 &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:
在HandlerMethodArgumentResolverComposite
的resolveArgument
處加斷點,開始跟蹤調試
這里很關鍵,千頭萬緒從這里開始,為什么是這里?參考的上邊的博文
斷點跟蹤情況:
(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多方法,最后才知道誰才是爹