Java责任链模式适用于多级审批与权限校验,通过统一接口和可插拔处理器实现解耦;各Handler专注单一职责,按@Order自动组装;RequestContext携带最小必要信息;拒绝结果统一收敛处理。

Java责任链模式是处理多级审批、权限校验等线性流程的天然选择——每个处理器只关注自己职责范围内的安全检查,不耦合上下游逻辑,扩展新审批环节只需新增Handler并调整链条顺序,无需修改已有代码。
设计核心:抽象统一的审批接口与可插拔的处理器
定义一个通用审批接口,所有具体权限校验器(如登录态校验、角色权限校验、数据级权限校验、风控规则拦截)都实现它:
public interface ApprovalHandler {
boolean approve(RequestContext context);
void setNext(ApprovalHandler next);
}
每个处理器内部只做一件事:判断当前上下文是否满足本级要求。若不通过,直接返回 false 并可设置拒绝原因;若通过,调用 next.approve(context) 继续流转。注意避免空指针,建议在基类中封装 next 的安全调用逻辑。
立即学习“Java免费学习笔记(深入)”;
构建灵活可配置的责任链
链的组装方式直接影响可维护性。推荐以下两种实践:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 硬编码组装(适合流程稳定、环节较少):在 Spring Boot 启动时通过 @PostConstruct 或 Configuration 显式 new HandlerA().setNext(new HandlerB().setNext(new HandlerC()))
- 声明式组装(推荐):用 @Order 注解标记各 Handler 实现类,再通过 ApplicationContext 获取所有 ApprovalHandler Bean,按 Order 值排序后串联。这样增删环节只需加/删 Bean 类,零配置变更
示例中,HandlerA(登录态校验)@Order(1),HandlerB(RBAC 角色校验)@Order(2),HandlerC(行级数据权限)@Order(3),自动构成「登录 → 角色 → 数据」三级过滤链。
上下文传递:携带足够信息,但不过度膨胀
RequestContext 是链条间共享状态的关键载体,应包含最小必要字段:
- 用户身份信息(subjectId、roles、permissions)
- 待操作资源标识(resourceId、resourceType)
- 操作类型(READ/WRITE/DELETE)
- 临时存储结果(如 HandlerA 存入 token 解析后的用户对象,供后续 Handler 复用)
避免把 HttpServletRequest 或完整 DTO 塞进上下文——既加重序列化负担,又导致 Handler 过度依赖 Web 层细节。建议用 record 或不可变 builder 构建上下文,保障线程安全。
异常与拒绝响应的统一收敛
责任链不抛异常,而是让每个 Handler 返回 boolean,并在链首或网关层统一处理拒绝结果:
- 某 Handler 返回 false 时,应将具体拒绝原因(如 “无访问该组织权限”)写入 context.rejectionReason
- 链执行完毕后,若最终结果为 false,由统一拦截器(如 Spring @ControllerAdvice)读取 rejectionReason,返回标准错误码(如 403 FORBIDDEN)和结构化提示
- 支持短路日志:记录首个失败 Handler 名称 + 拒绝原因,便于快速定位卡点
这样既保持链内逻辑干净,又确保对外错误语义清晰、可观测性强。


















