news 2026/8/29 5:16:35

Java 拦截器 2025 终极指南:从入门到“卷死”同事

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 分钟落地

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 原生,拦截器技术栈已全面进化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 0:24:25

sward快速上手指南 - 管理文档

上一篇文章介绍了如何创建第一个知识库&#xff0c;本文将介绍如何管理文档。1、添加目录添加目录有多个入口&#xff0c;下面用表格列举添加的入口位置路径描述知识库概况知识库->知识库概况->添加此处添加的目录&#xff0c;会显示在文档目录的第一层级文档页面的“”号…

作者头像 李华
网站建设 2026/8/28 3:48:34

解决‘No module named torch’错误:Miniconda-Python3.9路径问题排查

解决“No module named torch”错误&#xff1a;Miniconda-Python3.9路径问题排查 在搭建AI开发环境时&#xff0c;你是否曾遇到这样的场景——明明已经用pip install torch或conda install pytorch安装了PyTorch&#xff0c;但在Jupyter Notebook里一运行import torch&#xf…

作者头像 李华
网站建设 2026/8/25 19:27:14

python基于Vue的招投标系统_603gk_django Flask pycharm项目

目录已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 python基于Vue的招投标系统_603gk_dj…

作者头像 李华
网站建设 2026/8/28 12:06:45

通过SSH访问远程Miniconda-Python3.9进行PyTorch训练

通过SSH访问远程Miniconda-Python3.9进行PyTorch训练 在深度学习项目开发中&#xff0c;一个常见的挑战是&#xff1a;如何在本地编写代码的同时&#xff0c;充分利用远程服务器的强大GPU资源完成模型训练&#xff1f;更进一步&#xff0c;当团队成员使用不同操作系统、依赖版本…

作者头像 李华
网站建设 2026/8/28 18:14:40

社区二手图书交换小程序,输入图书信息和交换需求,自动匹配小区用户,支持线下交换,解决图书闲置浪费的问题。

我将为您创建一个完整的社区二手图书交换小程序系统。这个系统基于创新创业理论&#xff0c;旨在解决图书资源闲置和浪费问题。项目结构community_book_exchange/├── main.py # 主程序入口├── user_manager.py # 用户管理模块├── book_manager.py # 图书管理模块├──…

作者头像 李华