拦截器的运行流程分析(项目源码寻踪)
Posted 364.99°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拦截器的运行流程分析(项目源码寻踪)相关的知识,希望对你有一定的参考价值。
1.背景
- 我有两个后台,后台A需要调用后台B的接口,以实现从B的数据库中获取数据,并将数据存储到A的数据库中
- 为了保证安全性,我在A中定义了一个SignUtil的工具类根据一定规则生成签名,并将签名传入请求参数
- 在B中,为了验证参数和签名,我定义了两个拦截器来分别验证参数和签名(ParamsInterceptor(
extends HandlerInterceptor
)、SignInterceptor(extends HandlerInterceptorAdapter
)) - 并在WebMvcConfig中注册了两个拦截器
2.源码追踪分析工作流程
- 后台A的参数已经传到了B,并顺利通过了参数拦截器和签名拦截器的
preHandle
验证(两个preHandle都返回true),然后就交由HandlerExecutionChain
的applyPreHandle
继续处理:
- 先获取本工程中所有的Interceptor的类信息(必须是所有拦截器的preHandle都处理完之后才会跑到HandlerExecutionChain的applyPreHandle)
- 判断当前前置处理器返回的数据是否为true,如果为true,就将
interceptorIndex
置为i,并在遍历完所有拦截器的prehandle之后,如果所有的prehandle都返回true,则这里就返回true,否则就返回false
- 先获取本工程中所有的Interceptor的类信息(必须是所有拦截器的preHandle都处理完之后才会跑到HandlerExecutionChain的applyPreHandle)
- 执行完
HandlerExecutionChain
的applyPreHandle
之后,就交由DispatcherServlet
处理了- 判断
applyPreHandle
返回的值,如果返回值为false
就直接结束,也就不会分配实际的方法给你处理请求了
- 如果上述判断返回为
true
,DispatcherServlet
就会为请求分配具体的处理方法(实际调用处理程序)进行处理
- 然后程序就会来到后台A中处理改请求的接口方法处,继续运行:
- 判断
其流程如下图:
以上是关于拦截器的运行流程分析(项目源码寻踪)的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
源码分析-手写springMVC框架@RequestMapping和@Controller注解