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

Posted 往霄龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次 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多方法,最后才知道谁才是爹

以上是关于记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver的主要内容,如果未能解决你的问题,请参考以下文章

[软件测试_hw1]记一次调试bug的经历

记一次Gson在不同环境解析时间结果不同的BUG定位

记一次Gson在不同环境解析时间结果不同的BUG定位

记一次Gson在不同环境解析时间结果不同的BUG定位

记一次RestTemplate消息类型不匹配的BUG定位

记一次RestTemplate消息类型不匹配的BUG定位