Java中统一拦截器链的核心是定义标准Interceptor接口与InterceptorChain调度器,实现解耦、可插拔和顺序控制;接口含preHandle(返回boolean控制短路)和afterCompletion(倒序执行),链式调用支持异常透传与资源清理。

Java 中用接口实现统一的拦截器链条,核心是定义标准拦截器接口 + 责任链调度器,让各拦截器解耦、可插拔、顺序可控。不依赖 Spring 也能做,但结合 Spring 更易集成和管理。
定义统一拦截器接口
所有拦截器必须实现同一接口,约定执行时机和传递机制:
public interface Interceptor {
// 返回 true 表示继续执行后续拦截器或目标逻辑;false 表示中断
boolean preHandle(Request request, Response response) throws Exception;
<pre class="brush:php;toolbar:false;">// 无论 preHandle 是否成功,都会执行(类似 finally)
void afterCompletion(Request request, Response response, Exception ex);}
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
这个接口聚焦“前置处理”和“最终清理”,避免过度设计(如 postHandle),保持轻量。实际中可根据需要扩展,比如增加 order() 方法用于排序。
构建可编排的责任链调度器
用 List 存储拦截器,并按需执行链式调用。关键点在于:失败短路、异常透传、后置统一收尾:
public class InterceptorChain {
private final List<interceptor> interceptors;
<pre class="brush:php;toolbar:false;">public InterceptorChain(List<interceptor> interceptors) {
this.interceptors = new ArrayList(interceptors);
}
public boolean apply(Request request, Response response) throws Exception {
for (Interceptor interceptor : interceptors) {
if (!interceptor.preHandle(request, response)) {
return false; // 链条中断
}
}
return true;
}
public void complete(Request request, Response response, Exception ex) {
// 倒序执行 afterCompletion(类似过滤器的 finally 语义)
for (int i = interceptors.size() - 1; i >= 0; i--) {
interceptors.get(i).afterCompletion(request, response, ex);
}
}</interceptor>
}
- 拦截器列表建议不可变(构造时复制),防止运行时被篡改
-
complete()倒序调用,确保资源释放顺序与初始化/进入顺序相反(如 A→B→C 进入,则 C→B→A 清理) - 异常
ex在complete中透传,便于各拦截器记录日志或回滚
与业务目标协同执行
拦截器链本身不执行业务逻辑,需配合目标处理器(如 Handler、Service、Controller 方法)使用:
public class RequestHandler {
private final InterceptorChain chain;
private final BusinessProcessor processor;
<pre class="brush:php;toolbar:false;">public RequestHandler(InterceptorChain chain, BusinessProcessor processor) {
this.chain = chain;
this.processor = processor;
}
public Response handle(Request request) {
Response response = new Response();
Exception thrown = null;
try {
if (!chain.apply(request, response)) {
return response; // 拦截器已设响应,直接返回
}
return processor.process(request); // 执行真实业务
} catch (Exception e) {
thrown = e;
throw e;
} finally {
chain.complete(request, response, thrown);
}
}}
这种结构清晰分离了横切关注点(拦截)与核心逻辑(处理),也兼容异常场景下的资源清理。
Spring 环境下的自然集成方式
若项目已用 Spring,可利用 @Order 或实现 Ordered 接口自动排序,并通过 @Bean 注入链:
- 每个拦截器声明为
@Component,并标注@Order(10) - 在配置类中自动收集:
@Bean public InterceptorChain interceptorChain(List<interceptor> interceptors) { ... }</interceptor> - 也可对接 Spring MVC 的
HandlerInterceptor,复用其 preHandle/afterCompletion,仅需适配层
这样既保留自定义链的灵活性,又享受 Spring 生命周期和依赖注入优势。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










