当前位置: 首页 > news >正文

Spring Boot中的拦截器!

每次用户请求到达Spring Boot服务端,你是否需要重复写日志、权限检查或请求格式化代码?这些繁琐的“前置后置”工作让人头疼!好在,Spring Boot拦截器如同一道智能关卡,统一处理请求的横切逻辑,让代码优雅又高效。X平台@SpringBootDev称它为“微服务请求管道的卫兵”!数据显示,合理使用拦截器可减少50%的冗余代码,提升30%的开发效率。想让你的Spring Boot项目更简洁、性能更优?本文从原理到实战,带你玩转拦截器。

Spring Boot拦截器是什么?它如何简化请求处理?如何快速实现一个拦截器并应用到项目中?

在一个成熟的Web系统中,登录校验、日志记录、权限控制、接口限流……这些通用逻辑你是否每次都要手动复制粘贴?如果你正在使用SpringBoot框架,恭喜你,有一个“幕后英雄”早已为你准备好了优雅的解决方案——拦截器(Interceptor)!

那么,SpringBoot中的拦截器到底能做什么?它和过滤器、切面之间有什么区别?又该如何在项目中灵活应用?

观点与案例结合

Spring Boot拦截器基于Spring MVC的HandlerInterceptor接口,通过预处理、后处理和完成处理三个阶段,灵活管理请求流程。以下是核心原理与实战案例,助你快速上手。

拦截器基于Spring MVC,依赖于HandlerInterceptor接口,在请求处理前后发挥作用,具备三大核心方法:

  • preHandle:在控制器执行前调用,可用于登录验证。

  • postHandle:控制器处理完毕但未渲染视图时调用。

  • afterCompletion:整个请求完成后调用,可用于资源清理或异常处理。

1. 拦截器原理:请求生命周期的控制

核心:拦截器在请求到达控制器前(preHandle)、后(postHandle)和响应完成(afterCompletion)执行逻辑。

  • preHandle:请求到达控制器前,适合权限验证、参数校验。

  • postHandle:控制器处理后,视图渲染前,适合修改响应数据。

  • afterCompletion:响应完成后,适合清理资源、记录日志。
    流程图

请求 -> preHandle -> 控制器 -> postHandle -> 渲染视图 -> afterCompletion -> 响应

案例:某电商平台用拦截器统一校验用户Token,拦截90%的非法请求,降低后端压力。
实践:理解HandlerInterceptor接口,准备自定义拦截器。

2. 自定义拦截器:实现业务逻辑

场景:记录请求耗时和用户身份验证。
方法:实现HandlerInterceptor接口,重写三个方法。


代码(自定义拦截器):

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class LoggingInterceptor implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);logger.info("Request URL: {} | Method: {}", request.getRequestURL(), request.getMethod());// 模拟权限校验String token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {response.setStatus(401);logger.warn("Unauthorized access: Missing token");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.info("Controller processed, preparing response");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {long startTime = (Long) request.getAttribute("startTime");long duration = System.currentTimeMillis() - startTime;logger.info("Request completed in {}ms", duration);if (ex != null) {logger.error("Request failed: {}", ex.getMessage());}}
}

说明:preHandle校验Token并记录开始时间,afterCompletion计算耗时并记录异常。
案例:某微服务用拦截器记录API耗时,发现慢接口,优化后响应时间从500ms降至200ms。
实践:在Spring Boot项目中创建上述拦截器,测试日志输出。

3. 注册拦截器:应用到项目

场景:将拦截器应用到特定路径或全局。
方法:通过WebMvcConfigurer注册拦截器,指定拦截路径。


代码(拦截器配置):

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/api/**") // 拦截/api/下的请求.excludePathPatterns("/api/public/**"); // 排除公共接口}
}

说明:拦截/api/**路径,排除/api/public/**,灵活控制范围。
案例:某博客系统用拦截器对/api/admin/**路径做权限校验,防止未授权访问,安全性提升100%。
实践:在Spring Boot项目中添加上述配置,测试拦截效果。

4. 实战应用:典型场景

场景1:日志记录

  • 用拦截器记录请求URL、方法、耗时,上传到ELK分析。

  • 案例:某金融平台通过拦截器日志发现高频接口瓶颈,优化后吞吐量提升40%。

场景2:权限验证

  • 在preHandle检查用户Token或角色,拦截非法请求。

  • 案例:某SaaS平台用拦截器统一JWT验证,减少控制器代码50%。

场景3:请求预处理

  • 统一处理请求头、参数格式化或CORS设置。

  • 案例:某跨境电商用拦截器添加CORS头,支持跨域访问,用户体验提升20%。

实践:选择一个场景(如JWT验证),用拦截器实现并集成到项目。

5. 注意事项与优化

注意事项

  • 性能:拦截器逻辑需轻量,避免复杂计算影响性能。

  • 顺序:多个拦截器按注册顺序执行,注意逻辑冲突。

  • 异常处理:在afterCompletion捕获异常,防止漏报。
    优化技巧

  • 用ThreadLocal存储请求上下文,避免重复计算。

  • 结合Spring Security替换部分权限验证逻辑,简化拦截器。
    案例:某高并发系统用ThreadLocal优化拦截器,减少10%的内存开销。
    实践:在拦截器中添加ThreadLocal存储用户ID,测试性能提升。

对比维度拦截器(Interceptor)过滤器(Filter)AOP(面向切面编程)
作用域针对Spring MVC框架的请求处理流程Servlet容器级别的请求/响应处理方法级别的横切关注点
执行时机Controller方法调用前后、视图渲染前后请求到达Servlet前和响应返回前方法执行前、后或异常时
实现方式实现HandlerInterceptor接口实现javax.servlet.Filter接口通过切面(Aspect)、通知(Advice)等实现
依赖关系依赖Spring MVC框架依赖Servlet容器依赖Spring AOP或AspectJ
典型应用场景权限检查、日志记录、参数预处理等字符编码设置、XSS防护、全局跨域处理等事务管理、性能监控、缓存、异常处理等
优点1. 与Spring集成度高
2. 可以获取Handler信息
1. 更底层
2. 能处理静态资源
1. 解耦性好
2. 功能强大灵活
缺点1. 仅作用于Controller层
2. 功能相对简单
1. 无法获取Spring上下文
2. 不能精细控制处理流程
1. 学习曲线陡峭
2. 性能开销相对较大

社会现象分析

随着微服务架构的普及和接口安全日益重要,后端开发者对“统一入口控制”的需求愈发强烈。拦截器的使用,已经从“可选项”升级为“架构标配”。它在权限系统、接口防刷、接口日志、用户行为记录等方面被广泛采纳。


企业中,拦截器广泛用于API网关、日志收集和安全防护,如银行系统通过拦截器统一记录交易日志,确保审计合规。开源社区(如Spring)的拦截器教程Star数超2万,反映开发者对其依赖。拦截器不仅是技术工具,更是提升代码质量和效率的利器。

总结与升华

SpringBoot拦截器,是连接前端请求与后端业务的“守门员”,掌握其使用,意味着你对Web请求处理流程的理解又迈进了一大步。

Spring Boot拦截器通过preHandle、postHandle和afterCompletion三阶段,统一处理请求的日志、权限和预处理逻辑。它不仅简化了代码,还提升了系统的可维护性和性能。从日志记录到权限验证,拦截器是Spring Boot开发的得力助手。掌握拦截器,你的Web项目将更加优雅,开发效率一飞冲天!

拦截器之于SpringBoot,就像防火墙之于网络——不可见,却守护着系统的每一次请求安全。

相关文章:

  • 从电动化到智能化,法雷奥“猛攻”中国汽车市场
  • JVM——即时编译
  • Jenkins集成Maven
  • 5月9日复盘-混合注意力机制
  • 手撕红黑树的 左旋 与 右旋
  • AI产品智能录入功能分析:社区电商的“零摩擦”商品管理革命
  • Docker中mysql镜像保存与导入
  • Linux 学习笔记1
  • qxl显卡与spice模块笔记
  • Jenkins linux安装
  • 【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决
  • Github 热点项目 Cursor开源代替,AI代理+可视化编程!支持本地部署的隐私友好型开发神器。
  • ATH12K 驱动框架
  • SAM详解3.1(关于2和3的习题)
  • Debezium RelationalSnapshotChangeEventSource详解
  • SCADA|KIO程序导出变量错误处理办法
  • 5.0.5 变换(旋转、缩放、扭曲)
  • 4.1【LLaMA-Factory 实战】医疗领域大模型:从数据到部署的全流程实践
  • 谷云科技iPaaS发布 MCP Server加速业务系统API 跨入 MCP 时代
  • python: update() 函数的用法和例子
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • 协会:坚决支持司法机关依法打击涉象棋行业的违法行为
  • 晋级中部非省会第一城,宜昌凭什么
  • 《2025城市青年旅行消费报告》发布,解码青年出行特征
  • 潘功胜:央行将创设科技创新债券风险分担工具
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热