情况描述
前端输入框输入中文的横线 ——
,到后台接收时变成了 &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多方法,最后才知道谁才是爹