zl程序教程

您现在的位置是:首页 >  其他

当前栏目

拦截器的运行流程分析(项目源码寻踪)

流程项目源码 分析 运行 拦截器
2023-09-11 14:22:32 时间

1.背景

  • 我有两个后台,后台A需要调用后台B的接口,以实现从B的数据库中获取数据,并将数据存储到A的数据库中
  • 为了保证安全性,我在A中定义了一个SignUtil的工具类根据一定规则生成签名,并将签名传入请求参数
  • 在B中,为了验证参数和签名,我定义了两个拦截器来分别验证参数和签名(ParamsInterceptor(extends HandlerInterceptor)、SignInterceptor(extends HandlerInterceptorAdapter))
  • 并在WebMvcConfig中注册了两个拦截器

2.源码追踪分析工作流程

  • 后台A的参数已经传到了B,并顺利通过了参数拦截器和签名拦截器的preHandle验证(两个preHandle都返回true),然后就交由 HandlerExecutionChainapplyPreHandle 继续处理:
    • 先获取本工程中所有的Interceptor的类信息(必须是所有拦截器的preHandle都处理完之后才会跑到HandlerExecutionChain的applyPreHandle)
    • 判断当前前置处理器返回的数据是否为true,如果为true,就将interceptorIndex置为i,并在遍历完所有拦截器的prehandle之后,如果所有的prehandle都返回true,则这里就返回true,否则就返回false
  • 执行完HandlerExecutionChainapplyPreHandle之后,就交由 DispatcherServlet 处理了
    • 判断applyPreHandle返回的值,如果返回值为false就直接结束,也就不会分配实际的方法给你处理请求了
    • 如果上述判断返回为trueDispatcherServlet 就会为请求分配具体的处理方法(实际调用处理程序)进行处理
    • 然后程序就会来到后台A中处理改请求的接口方法处,继续运行:

其流程如下图: