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,就像防火墙之于网络——不可见,却守护着系统的每一次请求安全。
相关文章:

Spring Boot中的拦截器!
每次用户请求到达Spring Boot服务端,你是否需要重复写日志、权限检查或请求格式化代码?这些繁琐的“前置后置”工作让人头疼!好在,Spring Boot拦截器如同一道智能关卡,统一处理请求的横切逻辑,让代码优雅又…...

基于 Spring Boot 瑞吉外卖系统开发(十五)
基于 Spring Boot 瑞吉外卖系统开发(十五) 前台用户登录 在登录页面输入验证码,单击“登录”按钮,页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…...

计算机网络笔记(二十三)——4.5IPv6
4.5.1IPv6的基本首部 IPv6 的基本首部相对于 IPv4 进行了重大简化和优化,固定长度为 40 字节,大幅提升了路由器的处理效率。以下是各字段的详细说明: IPv6 基本首部字段组成 字段名位数作用描述版本 (Version)4 bits固定值为 6,…...

推荐一个Winform开源的UI工具包
从零学习构建一个完整的系统 推荐一个开源、免费的适合.NET WinForms 控件的套件。 项目简介 Krypton是一套开源的.Net组件,用于快速构建具有丰富UI交互的WinForms应用程序。 丰富的UI控件,提供了48个基础控件,如按钮、文本框、标签、下拉…...

位与运算
只有当除数是 2 的幂次方(如 2、4、8、16...)时,取模运算才可以转换为位运算。 int b 19;int a1 b % 16; // 传统取模运算int a2 b & 15; // 位运算替代取模printf("b %d\n", b);printf("b %% 8 %d\n",…...
算法备案如何判断自己的产品是否具备舆论属性
判断互联网产品是否具备舆论属性或社会动员能力,需要结合《具备舆论属性或社会动员能力的互联网信息服务安全评估规定》法规及实际功能、用户规模、信息传播方式等综合因素判定。 一、舆论属性判断标准 (1)服务功能与形式 信息交互功能&am…...
AR禁毒:科技赋能,筑牢防毒新防线
过去,传统禁毒宣传教育方式对普及禁毒知识、提高禁毒意识意义重大。但随着时代和社会环境变化,其困境逐渐显现。传统宣传方式单一,主要依靠讲座、发传单、办展览。讲座形式枯燥,对青少年吸引力不足;发传单易被丢弃&…...

趣味编程:四叶草
概述:在万千三叶草中寻觅,只为那一抹独特的四叶草之绿,它象征着幸运与希望。本篇博客主要介绍四叶草的绘制。 1. 效果展示 绘制四叶草的过程是一个动态的过程,因此博客中所展示的为绘制完成的四叶草。 2. 源码展示 #define _CR…...
访问者模式(Visitor Pattern)详解
文章目录 1. 访问者模式概述1.1 定义1.2 基本思想2. 访问者模式的结构3. 访问者模式的UML类图4. 访问者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 访问者模式处理复杂对象层次结构5.3 访问者模式在文件系统中的应用6. 访问者模式的优缺点6.1 优点6.2 缺点7. 访问者模式…...

城市生命线综合管控系统解决方案-守护城市生命线安全
一、政策背景 国务院办公厅《城市安全风险综合监测预警平台建设指南》要求:将燃气、供水、排水、桥梁、热力、综合管廊等纳入城市生命线监测体系,建立"能监测、会预警、快处置"的智慧化防控机制。住建部《"十四五"全国城市基础…...

# 2-STM32F103-复位和时钟控制RCC
STM32-复位和时钟控制RCC 2-STM32-复位和时钟控制RCC摘要说明本文参考资料如下: 一、STM32最小系统回顾STM32F103C8T6核心板原理图 二、复位三、时钟3.1 时钟树3.2 STM32启动过程3.2 SystemInit()函数3.2.1 SystemInit()第1句:3.2.2 SystemInit()第2句&a…...

多模态大语言模型arxiv论文略读(七十五)
PosterLLaVa: Constructing a Unified Multi-modal Layout Generator with LLM ➡️ 论文标题:PosterLLaVa: Constructing a Unified Multi-modal Layout Generator with LLM ➡️ 论文作者:Tao Yang, Yingmin Luo, Zhongang Qi, Yang Wu, Ying Shan, C…...
Angular 知识框架
一、Angular 基础 1. Angular 简介 Angular 是什么? 基于 TypeScript 的前端框架(Google 维护)。 适用于构建单页应用(SPA)。 核心特性 组件化架构 双向数据绑定 依赖注入(DI) 模块化设计…...
企业数字化转型背景下的企业知识管理挑战与经验杂谈
一、引言 在数字化转型的浪潮下,企业知识管理正面临前所未有的挑战。随着数据量的急剧增长,企业内部积累的信息呈现出碎片化、分散化的趋势,传统的知识管理体系已难以有效应对这一变革。首先,信息碎片化问题日益严重,…...

使用frp实现客户端开机自启(含静默运行脚本)
本文整理了如何使用 frp 客户端并实现 Windows 系统下的开机静默自启,适合远程桌面、内网穿透等场景。 📁 目录结构 我将 frp 客户端文件放置在以下路径: F:\git\frp>tree /f 卷 其它 的文件夹 PATH 列表 卷序列号为 A123-0F4E F:. │ …...

list 容器常见用法及实现
文章目录 1. list 的介绍与使用1.1 list 的介绍1.2 list 的使用1.2.1 list 的构造1.2.2 list iterator 的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 迭代器失效问题 2. list 的模拟实现2.1 值得注意的点:2.2 std::initializer_li…...

iOS视频编码详细步骤(视频编码器,基于 VideoToolbox,支持硬件编码 H264/H265)
iOS视频编码详细步骤流程 1. 视频采集阶段 视频采集所使用的代码和之前的相同,所以不再过多进行赘述 初始化配置: 通过VideoCaptureConfig设置分辨率1920x1080、帧率30fps、像素格式kCVPixelFormatType_420YpCbCr8BiPlanarFullRange设置摄像头位置&am…...

浅析 Golang 内存管理
文章目录 浅析 Golang 内存管理栈(Stack)堆(Heap)堆 vs. 栈内存逃逸分析内存逃逸产生的原因避免内存逃逸的手段 内存泄露常见的内存泄露场景如何避免内存泄露?总结 浅析 Golang 内存管理 在 Golang 当中,堆…...
记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
采用liunx Ubuntu22.04版本以下,需要安装 xrdp 或者VNC 具体过程就是下载 在linux命令行里 首先更新软件包:sudo apt update 安装xrdp服务:sudo apt install xrdp 启动XRDP:sudo systemctl start xrdp(如果在启动的…...

C++ 并发编程(1)再学习,为什么子线程不调用join方法或者detach方法,程序会崩溃? 仿函数的线程启动问题?为什么线程参数默认传参方式是值拷贝?
本文的主要学习点,来自 这哥们的视频内容,感谢大神的无私奉献。你可以根据这哥们的视频内容学习,我这里只是将自己不明白的点,整理记录。 C 并发编程(1) 线程基础,为什么线程参数默认传参方式是值拷贝?_哔…...

【Python 算法零基础 2.模拟 ④ 基于矩阵】
目录 基于矩阵 Ⅰ、 2120. 执行所有后缀指令 思路与算法 ① 初始化结果列表 ② 方向映射 ③ 遍历每个起始位置 ④ 记录结果 Ⅱ、1252. 奇数值单元格的数目 思路与算法 ① 初始化矩阵 ② 处理每个操作 ③ 统计奇数元素 Ⅲ、 832. 翻转图像 思路与算法 ① 水平翻转图像 ② 像素值…...

【教程】Docker方式本地部署Overleaf
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 下载仓库 初始化配置 修改监听IP和端口 自定义网站名称 修改数据存放位置 更换Docker源 更换Docker存储位置 启动Overleaf 创…...

3337|3335. 字符串转换后的长度 I(||)
1.字符串转换后的长度 I 1.1题目 3335. 字符串转换后的长度 I - 力扣(LeetCode) 1.2解析 递推法解析 思路框架 我们可以通过定义状态变量来追踪每次转换后各字符的数量变化。具体地,定义状态函数 f(i,c) 表示经过 i 次转换后࿰…...

PHP黑白胶卷底片图转彩图功能 V2025.05.15
关于底片转彩图 传统照片底片是摄影过程中生成的反色图像,为了欣赏照片,需要通过冲印过程将底片转化为正像。而随着数字技术的发展,我们现在可以使用数字工具不仅将底片转为正像,还可以添加色彩,重现照片原本的色彩效…...

字符串检索算法:KMP和Trie树
目录 1.引言 2.KMP算法 3.Trie树 3.1.简介 3.2.Trie树的应用场景 3.3.复杂度分析 3.4.Trie 树的优缺点 3.5.示例 1.引言 字符串匹配,给定一个主串 S 和一个模式串 P,判断 P 是否是 S 的子串,即找到 P 在 S 中第一次出现的位置。暴力匹…...
Java大师成长计划之第22天:Spring Cloud微服务架构
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 随着企业应用的不断扩展,…...
瀑布模型VS敏捷模型VS喷泉模型
目录 1. 瀑布模型(Waterfall Model) 2. 敏捷模型(Agile Model) 3. 喷泉模型(Fountain Model)...

基于.Net开发的网络管理与监控工具
从零学习构建一个完整的系统 平常项目上线后,不仅意味着开发的完成,更意味着项目正式进入日常运维阶段。在这个阶段,网络的监控与管理也是至关重要的,这时候就需要一款网络管理工具,可以协助运维人员用于日常管理&…...

Python并发编程:开启性能优化的大门(7/10)
1.引言 在当今数字化时代,Python 已成为编程领域中一颗璀璨的明星,占据着编程语言排行榜的榜首。无论是数据科学、人工智能,还是 Web 开发、自动化脚本编写,Python 都以其简洁的语法、丰富的库和强大的功能,赢得了广大…...
Linux 中 open 函数的本质与细节全解析
一、open简介 在 Linux 下,一切皆文件。而对文件的读写,离不开文件的“打开”操作。虽然 C 语言标准库提供了方便的 fopen,但更底层、更强大的是系统调用 open,掌握它能让你对文件系统控制更细致,在系统编程、驱动开发…...