一、什么是拦截器?一句话看懂

拦截器 = “请求/方法” 的横切逻辑植入器:
让你不改业务代码,就能在目标执行前后统一加戏——鉴权、日志、限流、事务、国际化 … 统统安排。

二、三大实现方式一张表看懂

类型 技术根 拦截粒度 能否截静态资源 典型场景 配置姿势
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 分钟落地

  1. 实现接口
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 多租户
   ├─ 内存限流 & 差分响应
   └─ 请求火焰图

七、最佳实践口诀

  1. 拦截器链能少就少,IO/DB 耗时操作异步化。
  2. preHandle 返回 false 时,一定自己回写 JSON,否则空白响应。
  3. 高优拦截器靠前注册;用 @Order 控制顺序。
  4. 生产加开关 + 熔断,防止拦截器故障拖垮全站。
  5. 复杂业务(事务、缓存)交给 AOP,让拦截器保持简洁。

八、结语

从 JSP 时代的 Filter,到 Spring MVC 的 HandlerInterceptor,再到 2025 的 Lambda 注册、响应式、GraalVM 原生,拦截器技术栈已全面进化

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐