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

Spring MVC 多个拦截器的执行顺序

一、流程总览

该流程图描述了一个多层拦截器链的业务处理流程,核心逻辑为:

  1. 前置拦截:通过 predHandler1predHandler2 逐层校验请求合法性。
  2. 核心处理:通过校验后执行核心业务逻辑 handler()
  3. 后置处理与清理:按反向顺序执行后置操作,最终完成资源释放。

二、模块功能与业务场景
1. 前置拦截模块
  • predHandler1()
    • 业务作用:执行第一层基础校验(如用户身份验证、请求合法性检查)。
    • 逻辑分支
      • **返回 **false:请求非法或校验失败,直接终止流程(如用户未登录时返回401错误)。
      • **返回 **true:进入下一层校验 predHandler2()
  • predHandler2()
    • 业务作用:执行第二层精细化校验(如权限校验、参数合规性验证)。
    • 逻辑分支
      • **返回 **false:校验失败,仅触发 afterCompletion1()(如记录失败日志),流程终止。
      • **返回 **true:进入核心业务处理 handler()

2. 核心业务模块
  • handler()
    • 业务作用:执行实际业务逻辑(如数据计算、数据库操作、服务调用)。
    • 触发条件:所有前置拦截器均通过(predHandler1predHandler2 均返回 true)。

3. 后置处理模块
  • postHandler2()
    • 业务作用:内层后置操作(如修改响应数据、记录操作日志)。
    • 执行顺序:优先于外层后置操作(postHandler1()),确保依赖资源可用。
  • postHandler1()
    • 业务作用:外层后置操作(如统计请求耗时、格式化最终响应)。

4. 完成清理模块
  • afterCompletion1()
    • 业务作用:外层资源释放(如关闭数据库连接、清理临时文件)。
    • 触发条件:只要 predHandler1 返回 true,无论后续流程是否成功,均会执行。
  • afterCompletion2()
    • 业务作用:内层资源释放(如提交事务、关闭内层连接)。
    • 触发条件predHandler2 返回 true 且流程执行到 handler() 后。

三、流程分支详解
分支 1:predHandler1** 返回 **false
  • 路径predHandler1 → 直接响应
  • 业务意义:基础校验失败,无需后续处理(如用户未登录时直接拒绝请求)。
分支 2:predHandler2** 返回 **false
  • 路径predHandler1 → predHandler2 → afterCompletion1
  • 业务意义:精细化校验失败(如用户无权限),但需释放外层资源(如记录失败日志)。
分支 3:所有拦截通过
  • 路径predHandler1 → predHandler2 → handler → postHandler2 → postHandler1 → afterCompletion2
  • 业务意义:完整处理请求,按反向顺序释放资源(如先提交事务,再关闭连接)。

四、流程设计的关键逻辑
  1. 前置顺序正向,后置顺序反向
    • 前置链:由外到内逐层校验(predHandler1 → predHandler2),确保基础条件优先验证。
    • 后置链:由内到外反向执行(postHandler2 → postHandler1),避免依赖资源提前释放。
  2. 资源释放的精准性
    • 外层资源(如数据库连接)在 afterCompletion1 释放。
    • 内层资源(如事务)在 afterCompletion2 释放,确保提交事务后再关闭连接。

五、实际应用场景
  1. API 请求校验链
    • predHandler1:验证 Token 有效性 → predHandler2:校验用户角色权限 → handler:返回数据。
    • 若角色权限不足,记录日志(afterCompletion1)并终止流程。
  2. 事务管理流程
    • predHandler1:打开数据库连接 → predHandler2:开启事务 → handler:执行业务 SQL。
    • postHandler2:提交事务 → postHandler1:关闭连接。

相关文章:

  • AI测试工具Testim——告别自动化测试维护难题
  • 开源|上海AILab:自动驾驶仿真平台LimSim Series,兼容端到端/知识驱动/模块化技术路线
  • git每次push都要输入用户名和密码很繁琐,只在第一次输入之后都不需要的解决方法
  • 企业架构之旅(1):TOGAF 基础入门
  • AI如何重塑DDoS防护行业?六大变革与未来展望
  • 【计算机网络分类全解析】从局域网到广域网的工程实践
  • 生成式人工智能认证(GAI认证)要学哪些知识?
  • DigitalOcean推出Valkey托管缓存服务
  • Pikachu靶场-PHP反序列化漏洞
  • 缓存并发更新的挑战
  • FastAPI中使用Pydantic进行数据验证的示例与关键技术点分析
  • failed to start gdm.service - gnome display manager
  • AUTOSAR_RS_ClassicPlatformDebugTraceProfile
  • CUDA Stream 回调函数示例代码
  • Pacman-search
  • 【RabbitMQ】保证消息不丢失
  • PaddleX的安装
  • “八股训练营”学习总结
  • C++STL(九) :bitset的介绍与使用
  • 特征工程四:数据特征提取TfidfVectorizer的使用
  • 商务部:4月份以来的出口总体延续平稳增长态势
  • 民调显示特朗普执政百日支持率为80年来美历任总统最低
  • 孟泽:我们简化了历史,因此也简化了人性
  • 陈平评《艺术科学的目的与界限》|现代艺术史学的奠基时代
  • 明查|把太平洋垃圾污染问题甩锅中国,特朗普用的是P过的图
  • 秦洪看盘|短线热点降温,A股回落整固