“拦截器”(Interceptor)的原理其实并不神秘,核心思想是:在目标逻辑执行前后,插入一段通用逻辑,而不修改目标代码本身。
不同技术栈(如 Java、Android、OkHttp、Spring 等)只是实现方式不同,但思想是一致的。
我分层给你讲:一句话原理 → 通用模型 → 典型实现方式 → 举例说明 → 常见误区。
拦截器就是一种“钩子机制”,在请求/调用到达目标之前或之后,拦截并执行额外逻辑。
无论是哪种拦截器,都可以抽象成这样一个模型:
[调用方]
↓
[拦截器链]
↓
[目标方法 / 处理器]
↓
[返回结果]
执行顺序通常是:
before → 目标执行 → after
如果中间返回了结果或抛异常,目标可能根本不会执行。
核心思想:
Interceptor1
↓
Interceptor2
↓
Interceptor3
↓
Target
interface Interceptor {
Response intercept(Chain chain);
}
interface Chain {
Request request();
Response proceed(Request request);
}
每个拦截器调用 chain.proceed() 才会继续往下走。
✅ 典型代表
核心思想:
class TargetProxy implements Target {
Target real;
void execute() {
before();
real.execute();
after();
}
}
Proxy.newProxyInstance(...)
✅ 典型代表
核心思想:
void execute() {
onStart();
doWork();
onEnd();
}
✅ 典型代表
class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long start = System.nanoTime();
Response response = chain.proceed(request); // 放行
long end = System.nanoTime();
System.out.println("耗时:" + (end - start));
return response;
}
}
关键点:
chain.proceed() 是继续向下执行的关键boolean preHandle()
void postHandle()
void afterCompletion()
执行顺序:
preHandle → Controller → postHandle → afterCompletion
原理:
| 概念 | 本质 | 使用场景 |
|---|---|---|
| 拦截器 | 责任链 / 钩子 | 业务层、网络层 |
| 过滤器 | 责任链 | Servlet 请求 |
| AOP | 代理 | 方法级增强 |
❌ 拦截器 = 修改原代码
✅ 实际是不侵入原逻辑
❌ 拦截器一定执行
✅ 可能被前面的拦截器拦截掉
❌ 拦截器越多越好
✅ 过多会影响性能和可读性
拦截器的原理 = 钩子 + 责任链 + 控制流程转移
如果你愿意,我可以:
你更想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。