当前位置: 首页 > news >正文

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

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中处理改请求的接口方法处,继续运行:

其流程如下图:

相关文章:

  • 如何让不给听得歌乖乖听话?python教你如何做...
  • 【微服务40】分布式事务Seata源码解析八:AT模式下本地事务的执行流程
  • 面试汇总(一)
  • 分布式任务调度XXL-JOB-第二章-SpringBoot集成XXL-JOB
  • Linux系统下查看被杀死进程的信息
  • 粒子群算法PSO求解最大值和最小值案例(超详细注释)
  • LeetCode每日一题——902. 最大为 N 的数字组合
  • Java学习--JDBC
  • C++中GDAL批量创建多个栅格图像文件并批量写入数据
  • 基于maven的spring项目实现登录注册(SSM)
  • 【C++】动态内存管理
  • 波士顿动力再惊艳!机器人大秀男团舞,举手投足人味满满,多次转卖后展示新标签...
  • Python 代码托管到码云平台,原来这么简单
  • 【MATLAB教程案例26】图像特征点提取算法matlab仿真与分析——sift,surf,kaze,corner,BRISK等
  • 前端深拷贝与浅拷贝(附实现方法)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Apache的80端口被占用以及访问时报错403
  • eclipse(luna)创建web工程
  • JavaScript中的对象个人分享
  • js 实现textarea输入字数提示
  • python_bomb----数据类型总结
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 分布式事物理论与实践
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 区块链共识机制优缺点对比都是什么
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 探索 JS 中的模块化
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 原生js练习题---第五课
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #define,static,const,三种常量的区别
  • (JS基础)String 类型
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot教学评价 毕业设计 641310
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)视频码率,帧率和分辨率的联系与区别
  • .apk文件,IIS不支持下载解决
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net打印*三角形
  • .NET大文件上传知识整理
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .so文件(linux系统)
  • @Async注解的坑,小心
  • @JsonSerialize注解的使用
  • @Not - Empty-Null-Blank
  • [@Controller]4 详解@ModelAttribute
  • [<死锁专题>]
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略