实现自定义RequestBodyAdvice的原理
2020-11-18 12:11:15 0 举报
登录查看完整内容
描述了实现RequestBodyAdvice接口,来对@RequestBody传入的数据进行处理的原理。可用于项目中对XSS攻击进行统一的防范。
作者其他创作
大纲/内容
通过GenericHttpMessageConverter的实现类的read方法反序列化请求参数
Tomcat启动
通过InvocableHandlerMethod.getMethodArgumentValues将请求参数和请求体转为Controller方法中对应的入参
中间过程省略
通过CustomRequestBodyAdvice实现RequestBodyAdvice接口,来处理所有通过@RequestBody传入的用户输入,可用于项目中统一防范XSS攻击。
通过HandlerMethodArgumentResolver的不同实现类的resolveArgument方法来处理具体的逻辑
通过doInvoke方法实际调用Controller的方法,后续步骤省略
RequestResponseBodyAdviceChain.afterBodyRead()
CustomRequestBodyAdvice.supports
浏览器发起HTTP请求的调用流程
客户端发起请求调用
RequestResponseBodyAdviceChain.beforeBodyRead()
RequestMappingHandlerAdapter.afterPropertiesSet
2. 从被@ControllerAdvice修饰的Bean中查找继承了RequestBodyAdvice的Bean,并存入requestResponseBodyAdvice中
其他HandlerMethodArgumentResolver的实现类
RequestResponseBodyMethodProcessor处理@RequestBody修饰的参数
new RequestResponseBodyAdviceChain(List<Object> requestResponseBodyAdvice)
3. 传入requestResponseBodyAdvice
遍历集合
RequestResponseBodyAdviceChain.getMatchingAdvice获取RequestBodyAdvice的实现
5.requestBodyAdvice实际生效的位置
PathVariableMethodArgumentResolver处理@PathVariable修饰的参数
RequestMappingHandlerAdapter.initControllerAdviceCache
省略中间连续的构造方法
ControllerAdviceBean.findAnnotatedBeans
进入到CustomRequestBodyAdvice.afterBodyRead()方法中,执行自定义的处理流程
其他的处理流程,不详述
support=false
PageableHandlerMethodArgumentResolver处理Pageable参数
4. 将requestResponseBodyAdvice分别保存到requestBodyAdvice和responseBodyAdvice中。保存前会验证bean是否分别继承自RequestBodyAdvice和ResponseBodyAdvice
RequestMappingHandlerAdapter.getDefaultArgumentResolvers
InvocableHandlerMethod.invokeForRequest
support=true
1. 通过Spring上下文,查找被@ControllerAdvice修饰的Bean
DispatcherServlet.doDispatch中获取HandlerAdapter,并调用handle方法
经过RequestMappingHandlerAdapter后,进入到ServletInvocableHandlerMethod.invokeAndHandle
CustomRequestBodyAdvice生效的要素:1.实现RequestBodyAdvice接口;2.增加@ControllerAdvice注解;3.所在包的路径需要能被Spring扫描。
Spring项目启动流程
0 条评论
回复 删除
下一页