在 Java 生态中,“拦截器(Interceptor)”并不是某一种固定技术,而是一种设计思想和通用机制:在目标方法 / 请求真正执行前后,插入一段通用逻辑,而不修改业务代码本身。
下面从原理本质 → 常见实现方式 → 典型场景三个层面说明。
拦截器本质 = 代理 + 回调 + 责任链
典型:Spring AOP、MyBatis 插件
public interface UserService {
void save();
}
代理过程:
调用者
↓
代理对象(Interceptor)
↓
真实对象
原理:
✅ 优点:业务无侵入
❌ 只能拦截“可被代理的方法”
典型:Servlet Filter、Spring Interceptor
请求流程:
HTTP 请求
↓
Filter
↓
Interceptor
↓
Controller
| 组件 | 层 |
|---|---|
| Filter | Servlet 容器 |
| Interceptor | Spring MVC |
✅ 常用于:
典型:MyBatis Interceptor
@Intercepts({
@Signature(type=Executor.class, method="update", args={...})
})
原理:
✅ 精细控制 SQL 执行
典型:AspectJ、Java Agent
✅ 最强能力
❌ 复杂度高
以 Spring Interceptor 为例:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(req, res, handler) {
// 执行前
return true; // false = 拦截
}
@Override
public void postHandle(...) {
// 执行后
}
@Override
public void afterCompletion(...) {
// 最终
}
}
| 对比 | 拦截器 | 过滤器 | AOP |
|---|---|---|---|
| 层级 | MVC | Servlet | 方法级 |
| 依赖 Spring | 是 | 否 | 是 |
| 精细度 | Controller | 请求 | 任意方法 |
Java 拦截器原理:通过代理或框架钩子,在方法/请求执行前后插入统一逻辑,实现解耦和复用。
如果你指的是某一个具体拦截器(如 Spring、MyBatis、OKHttp、Dubbo),我可以结合源码讲得更细。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。