
一、流程总览
该流程图描述了一个多层拦截器链的业务处理流程,核心逻辑为:
- 前置拦截 :通过
predHandler1
和predHandler2
逐层校验请求合法性。 - 核心处理 :通过校验后执行核心业务逻辑
handler()
。 - 后置处理与清理:按反向顺序执行后置操作,最终完成资源释放。
二、模块功能与业务场景
1. 前置拦截模块
predHandler1()
- 业务作用:执行第一层基础校验(如用户身份验证、请求合法性检查)。
- 逻辑分支 :
- **返回 **
false
:请求非法或校验失败,直接终止流程(如用户未登录时返回401错误)。 - **返回 **
true
:进入下一层校验predHandler2()
。
- **返回 **
predHandler2()
- 业务作用:执行第二层精细化校验(如权限校验、参数合规性验证)。
- 逻辑分支 :
- **返回 **
false
:校验失败,仅触发afterCompletion1()
(如记录失败日志),流程终止。 - **返回 **
true
:进入核心业务处理handler()
。
- **返回 **
2. 核心业务模块
handler()
- 业务作用:执行实际业务逻辑(如数据计算、数据库操作、服务调用)。
- 触发条件 :所有前置拦截器均通过(
predHandler1
和predHandler2
均返回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
- 业务意义:完整处理请求,按反向顺序释放资源(如先提交事务,再关闭连接)。
四、流程设计的关键逻辑
- 前置顺序正向,后置顺序反向
- 前置链 :由外到内逐层校验(
predHandler1 → predHandler2
),确保基础条件优先验证。 - 后置链 :由内到外反向执行(
postHandler2 → postHandler1
),避免依赖资源提前释放。
- 前置链 :由外到内逐层校验(
- 资源释放的精准性
- 外层资源 (如数据库连接)在
afterCompletion1
释放。 - 内层资源 (如事务)在
afterCompletion2
释放,确保提交事务后再关闭连接。
- 外层资源 (如数据库连接)在
五、实际应用场景
- API 请求校验链
predHandler1
:验证 Token 有效性 →predHandler2
:校验用户角色权限 →handler
:返回数据。- 若角色权限不足,记录日志(
afterCompletion1
)并终止流程。
- 事务管理流程
predHandler1
:打开数据库连接 →predHandler2
:开启事务 →handler
:执行业务 SQL。postHandler2
:提交事务 →postHandler1
:关闭连接。