Java中用接口配合责任链实现动态拦截的核心是定义统一拦截接口(如boolean preHandle(Context ctx))、各拦截器独立实现业务逻辑、由独立ChainExecutor调度执行,支持运行时插拔与条件装配。

Java 中用接口配合责任链模式实现动态拦截处理,核心在于定义统一的拦截契约、让每个具体拦截器实现该接口,并通过链式引用或外部调度器控制执行顺序与中断逻辑。它不依赖硬编码调用,而是靠接口抽象 + 运行时组装来达成灵活拦截。
定义标准化拦截接口
所有拦截器必须实现同一个接口,明确“能否处理”和“如何处理”两个关键动作。常见设计包含前置判断、主处理、后置清理三类方法,但最简有效的是单方法判定接口:
- 推荐使用 boolean preHandle(Context ctx):返回 true 表示放行(继续向后传递),false 表示拦截终止链
- Context 是共享上下文对象,封装请求参数、响应容器、线程安全的属性存储(如
ctx.setAttribute("userId", "1001")),避免静态变量或参数层层透传 - 接口不强制持有 next 引用——这属于链的组织方式,不是接口职责;解耦更干净
具体拦截器按需实现业务逻辑
每个拦截器只关注自身职责,不感知上下游。例如:
-
AuthInterceptor:检查 token 是否合法,无效则
ctx.setErrorCode(401); return false; -
RateLimitInterceptor:查 Redis 计数器,超限则
ctx.setMsg("Too many requests"); return false; -
LogInterceptor:记录请求耗时,
ctx.setStartTime(System.nanoTime()); return true;
它们都实现同一接口,但内部逻辑完全独立,新增或移除不影响其他拦截器编译或运行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
链的组装与执行交给独立管理器
不建议在拦截器内部硬写 next.preHandle(ctx),而应由一个中立的 ChainExecutor 类统一调度:
- 接收拦截器列表(如
List<Interceptor>),支持按 order 排序(Spring 风格)或按注册顺序执行 - 遍历执行:
for (Interceptor i : chain) { if (!i.preHandle(ctx)) break; } - 可扩展能力:支持跳过某拦截器(基于条件)、记录执行路径、统计各环节耗时
- Spring 环境下可直接用
HandlerInterceptor+WebMvcConfigurer.addInterceptors(),order 值决定位置
动态性体现在运行时可插拔
真正实现“动态”,关键不在代码结构,而在装配时机和策略:
- 拦截器实例可从配置中心加载(如 Nacos 中开关字段为 false,则不加入链)
- 根据请求路径匹配启用子链:
if (ctx.getPath().startsWith("/admin/")) { adminChain.execute(ctx); } - 结合 Spring @ConditionalOnProperty 或 @Profile,不同环境启用不同拦截组合
- 灰度发布时,用用户 ID 哈希值决定是否进入某拦截器,无需重启服务

















