温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

拦截器原理是什么

发布时间:2026-08-30 04:50:41 来源:亿速云 阅读:102 作者:小樊 栏目:编程语言

“拦截器”(Interceptor)的原理其实并不神秘,核心思想是:在目标逻辑执行前后,插入一段通用逻辑,而不修改目标代码本身
不同技术栈(如 Java、Android、OkHttp、Spring 等)只是实现方式不同,但思想是一致的。

我分层给你讲:一句话原理 → 通用模型 → 典型实现方式 → 举例说明 → 常见误区


一句话原理

拦截器就是一种“钩子机制”,在请求/调用到达目标之前或之后,拦截并执行额外逻辑。


通用模型(本质)

无论是哪种拦截器,都可以抽象成这样一个模型:

[调用方]
   ↓
[拦截器链]
   ↓
[目标方法 / 处理器]
   ↓
[返回结果]

执行顺序通常是:

before → 目标执行 → after

如果中间返回了结果或抛异常,目标可能根本不会执行


拦截器的三种常见实现原理

1️⃣ 责任链模式(最常见)

核心思想:

  • 拦截器组成一个“链”
  • 每个拦截器决定是否:
    • 继续执行下一个
    • 直接返回结果
    • 中断流程

抽象流程

Interceptor1
   ↓
Interceptor2
   ↓
Interceptor3
   ↓
Target

伪代码

interface Interceptor {
    Response intercept(Chain chain);
}

interface Chain {
    Request request();
    Response proceed(Request request);
}

每个拦截器调用 chain.proceed() 才会继续往下走。

典型代表

  • OkHttp Interceptor
  • Netty Pipeline
  • Servlet Filter(思想类似)

2️⃣ 代理模式(AOP 常用)

核心思想:

  • 不修改原对象
  • 用一个“代理对象”包住它
  • 调用代理 → 增强逻辑 → 调用真实对象

静态代理

class TargetProxy implements Target {
    Target real;

    void execute() {
        before();
        real.execute();
        after();
    }
}

动态代理(更常见)

Proxy.newProxyInstance(...)

典型代表

  • Spring AOP
  • Retrofit
  • MyBatis 插件

3️⃣ 模板方法 / 回调机制

核心思想:

  • 框架定义“执行骨架”
  • 你在固定位置插入逻辑
void execute() {
    onStart();
    doWork();
    onEnd();
}

典型代表

  • Android 生命周期
  • 某些 SDK 初始化流程

经典例子讲解

✅ OkHttp 拦截器原理(最典型)

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()继续向下执行的关键
  • 不调用它 → 请求直接中断

✅ Spring 拦截器(HandlerInterceptor)

boolean preHandle()
void postHandle()
void afterCompletion()

执行顺序:

preHandle → Controller → postHandle → afterCompletion

原理:

  • DispatcherServlet 在调用 Controller 前后主动回调拦截器
  • 不是代理,而是框架调度

拦截器 vs 过滤器 vs AOP

概念 本质 使用场景
拦截器 责任链 / 钩子 业务层、网络层
过滤器 责任链 Servlet 请求
AOP 代理 方法级增强

常见误区

❌ 拦截器 = 修改原代码
✅ 实际是不侵入原逻辑

❌ 拦截器一定执行
✅ 可能被前面的拦截器拦截掉

❌ 拦截器越多越好
✅ 过多会影响性能和可读性


总结一句话

拦截器的原理 = 钩子 + 责任链 + 控制流程转移

如果你愿意,我可以:

  • 你正在用的技术栈 详细讲(Spring / OkHttp / Android / Netty)
  • 画一张执行流程图
  • 对比拦截器和中间件

你更想看哪一种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI