Java 拦截器 2025 终极指南:从入门到“卷死”同事
·
一、什么是拦截器?一句话看懂
拦截器 = “请求/方法” 的横切逻辑植入器:
让你不改业务代码,就能在目标执行前后统一加戏——鉴权、日志、限流、事务、国际化 … 统统安排。
二、三大实现方式一张表看懂
| 类型 | 技术根 | 拦截粒度 | 能否截静态资源 | 典型场景 | 配置姿势 |
|---|---|---|---|---|---|
| Servlet Filter | JSP 时代遗产 | 请求级 | ✅ | 编码、CORS、HTTPS 强制 | web.xml / @WebFilter |
| Spring HandlerInterceptor | Spring MVC | Controller 级 | ❌ | 登录态、接口计时、失败统一包装 | WebMvcConfigurer |
| AOP Interceptor | Spring AOP | 方法级(任意 Bean) | ❌ | 事务、缓存、方法日志 | @Aspect + @Around |
一句话记忆:
请求级用 HandlerInterceptor, 方法级用 AOP, 底层通用用 Filter。
三、SpringMVC 拦截器 5 分钟落地
- 实现接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req,
HttpServletResponse resp,
Object handler) {
// 1. 前置逻辑:鉴权、参数校验、日志...
return true; // true 继续;false 中断
}
@Override
public void postHandle(...) { /* 2. Controller 后、渲染前 */ }
@Override
public void afterCompletion(...) { /* 3. 全部完成 */ }
}
2.注册
@Configuration
public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/login");
}
}
3.执行顺序
preHandle 正序 → Controller → postHandle 逆序 → 渲染 → afterCompletion 逆序
(先注册的先执行前置,后执行后置)
四、2025 最新玩法(Lambda、响应式、原生镜像)
1.Lambda 式注册(Spring Boot 3.2+)
不再需要 @Configuration:
@Bean
public InterceptorRegistrationFunction myInterceptor() {
return registry -> registry
.addInterceptor((req, resp, h) -> { /* 逻辑 */ })
.addPathPatterns("/api/**");
}
2.响应式 WebFilter(Spring 6 + WebFlux)
@Component
public class ReactiveAuthFilter implements WebFilter {
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange)
.contextWrite(ctx -> ctx.put("tenantId", parseTenant(exchange)));
}
}
3.GraalVM Native 友好
native-image 禁止反射,必须显式声明:
@RegisterReflection({MyInterceptor.class})
public class MyInterceptor implements HandlerInterceptor {}
编译后体积 50 MB,启动 0.05 s。
五、进阶骚操作
| 需求 | 实现要点 |
|---|---|
| 运行时热插拔 | 把 InterceptorRegistry 注入,代码里 addInterceptor 即时生效,后台点按钮就灰度。 |
| 多租户线程穿透 | 用 TransmittableThreadLocal(阿里 TTL),线程池、异步照样传递 tenantId。 |
| 透明刷新 Token | 在 preHandle 解析旧 JWT,响应头带回新 Token,前端无感替换。 |
| 内存令牌桶限流 | ConcurrentHashMap + Guava RateLimiter,单机 1 ms 级拒绝,无需网关。 |
| 差分响应 | 用 JSON-Patch 对比“本次 vs 缓存”,只给前端变化字段,移动端省流 90%。 |
| 请求火焰图 | afterCompletion 里把各阶段耗时写成 pprof 格式,上传 FlameGraph 服务器,3 min 出图,比 Zipkin 更直观。 |
六、一张脑图带走
Java 拦截器 2025
├─ 传统三剑客(Filter/HandlerInterceptor/AOP)
├─ 最新实现
│ ├─ Lambda 注册(Boot 3.2+)
│ ├─ Reactive WebFilter(Spring 6)
│ └─ GraalVM 原生
└─ 黑科技
├─ 热插拔 & TTL 多租户
├─ 内存限流 & 差分响应
└─ 请求火焰图
七、最佳实践口诀
- 拦截器链能少就少,IO/DB 耗时操作异步化。
preHandle返回 false 时,一定自己回写 JSON,否则空白响应。- 高优拦截器靠前注册;用
@Order控制顺序。 - 生产加开关 + 熔断,防止拦截器故障拖垮全站。
- 复杂业务(事务、缓存)交给 AOP,让拦截器保持简洁。
八、结语
从 JSP 时代的 Filter,到 Spring MVC 的 HandlerInterceptor,再到 2025 的 Lambda 注册、响应式、GraalVM 原生,拦截器技术栈已全面进化。
更多推荐

所有评论(0)