记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver

情况描述

前端输入框输入中文的横线 —— ,到后台接收时变成了 &madsh;$mdash

正常应该显示成这样:

bug调试思路记录

最开始完全没有向调试源码方面想,试了不少方法,都没解决,没办法了只能源码跟踪排查问题。
想着那个类是解析参数的?加个断点调试下就清除了,问题是不清楚到底是哪个类。so,search
---
开始
步骤1:搜索一下 : spring 参数解析
结果很多,看了很多博文之后,参考博客地址
发现了 HandlerMethodArgumentResolver
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第1张图片

这里有两个函数,其中resolveArgument是 负责解析request中的参数,赋给controller

//负责解析request中的参数,赋给controller
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;

步骤2:
HandlerMethodArgumentResolverCompositeresolveArgument处加断点,开始跟踪调试
这里很关键,千头万绪从这里开始,为什么是这里?参考的上边的博文
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第2张图片

断点跟踪情况:

(1)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第3张图片

(2)InvocableHandlerMethod
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第4张图片

(3)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第5张图片

(4)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第6张图片

(5)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第7张图片

(6)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第8张图片

(7)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第9张图片

(8)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第10张图片

(9)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第11张图片

我们关注的是remark中的——,F6执行for循环,直接到remark

(10)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第12张图片

(11)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第13张图片

(12) 这一步,参数发生变化
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第14张图片

(13)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第15张图片

(14)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第16张图片

附XSS攻击介绍博文:XSS攻击

(15)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第17张图片

(16)
记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver_第18张图片

以上步骤是最后总结出来的,第一遍调试不知道参数到哪里发生变化了,所以还有很多方法F5进入看了看,
跟着断点一个方法一个方的过,最后发现在执行完这个方法后,原来的——变为了 &madsh

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

总结

这个bug花了一上午才找出原因...
首先是刚刚接手对项目不熟悉,不知道BaseController中有 initBinder配置
再者也是不知从何入手调试,源码调试经验不足
---
花里胡哨各种搜索,试了n多方法,最后才知道谁才是爹

你可能感兴趣的:(记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver)