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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据如何解决

说明: 开发中经常会碰到线程并发,但是后续线程需要等待第一个线程执行完返回结果后,才能再执行后面线程。 如何处理呢,今天就介绍两种方法 1、使用Java自有的API即CountDownLatch,进行实现 思考:CountDown…

js原型污染 + xss劫持base -- no-code b01lersctf 2025

题目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我们先来搞清楚究竟发生了什么 当我们访问 /index /*** 处理 /:page 路径的 GET 请求* param {Object} req - 请求对象* param {Object} reply - 响应对象* returns {Pro…

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen(通义千问)智能体框架是阿里云推出的新一代AI智能体开发平台,其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计,将L…

vue数据可视化开发常用库

一、常用数据可视化库 1. ECharts 特点&#xff1a;功能强大&#xff0c;支持多种图表类型&#xff0c;社区活跃。适用场景&#xff1a;复杂图表、大数据量、3D 可视化。安装&#xff1a;npm install echarts示例&#xff1a;<template><div ref"chart" c…

小红书视频无水印下载方法

下载小红书&#xff08;RED/Xiaohongshu&#xff09;视频并去除水印可以通过以下几种方法实现&#xff0c;但请注意尊重原创作者版权&#xff0c;下载内容仅限个人使用&#xff0c;避免侵权行为。 方法一&#xff1a;使用在线解析工具&#xff08;推荐&#xff09; 复制视频链…

Qt读写XML文档

XML 结构与概念简介 XML&#xff08;可扩展标记语言&#xff09; 是一种用于存储和传输结构化数据的标记语言。其核心特性包括&#xff1a; 1、树状结构&#xff1a;XML 数据以层次化的树形结构组织&#xff0c;包含一个根元素&#xff08;Root Element&#xff09;&#xff…

lambda 表达式

C 的 lambda 表达式 是一种轻量、内联的函数对象写法&#xff0c;广泛用于标准算法、自定义回调、事件响应等场景。它简洁且强大。以下将系统、详细地讲解 lambda 的语法、捕获规则、应用技巧和实际使用场景。 &#x1f9e0; 一、基本语法 [捕获列表](参数列表) -> 返回类型…

Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?

Web端访问缓慢问题诊断指南(测试工程师专项版) ——从浏览器渲染到网络层的全链路排查方案 一、问题定位黄金法则(前端性能四象限) 1. [网络层] 数据返回快 ≠ 资源加载快(检查Content Download时间) 2. [渲染层] DOM复杂度与浏览器重绘(查看FPS指标) 3. [执行层…

Docker网络模式深度解析:Bridge与Host模式对比及实践指南

#作者&#xff1a;邓伟 文章目录 一、引言二、Bridge模式&#xff08;网桥模式&#xff09;2.1 工作原理2.2 核心特性2.4 适用场景2.5 优缺点分析 三、Host模式3.1 工作原理3.2 核心特性3.3 配置方法3.4 适用场景3.5 优缺点分析 四、网桥模式与Host模式对比五、最佳实践与注意…

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…

备战蓝桥杯国赛第一天-atcoder-beginner-contest404

B. 因为只有四种情况&#xff0c;旋转90/180/270度后替换&#xff0c;直接替换&#xff0c;暴力即可 C. 循环图的定义是每个点出度为2&#xff0c;而且只有一个环的&#xff0c;所以先判断出度&#xff0c;再判断是否成环 #include <bits/stdc.h> using namespace st…

Linux59 SSH配置前瞻 JumpServer双网卡ping通

为什么Ping这个IP地址Ping得通 本地址 [rootlocalhost network-scripts]# cat ifcfg-ens33 iTYPEEthernet BOOTPROTOnone DEFROUTEyes DEVICEens33 ONBOOTno IPADDR192.168.235.4 NETMASK255.255.255.0 GATEWAY192.168.235.2 DNS1114.114.114.114 [rootlocalhost network-scrip…

Spring框架(1)

Spring框架是Java企业级开发中最受欢迎的框架之一&#xff0c;它通过简化开发流程、降低耦合度&#xff0c;让开发者能够更专注于业务逻辑的实现。本文将带你了解Spring框架的核心概念和基本用法。 一、Spring框架简介 Spring是一个轻量级的开源Java开发框架&#xff0c;由Ro…

QWindowkit 实现无边框,阴影支持系统边栏缩放等功能

一.感谢作者,QWindowkit 源码地址: GitHub - stdware/qwindowkit: Cross-platform frameless window framework for Qt. Support Windows, macOS, Linux. 二.集成pro工程: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 # Yo…

-bash: /usr/local/mysql/bin/mysqld: No such file or directory

-bash: /usr/local/mysql/bin/mysqld: No such file or directory 1.Mysql安装常见的报错信息1.1.报错信息1.2.分析问题1.3.解决问题 endl 1.Mysql安装常见的报错信息 1.1.报错信息 [rootRocky9-12 ~]#echo $PATH /root/.local/bin:/root/bin:/usr/local/mysql/bin:/usr/loca…

【愚公系列】《Manus极简入门》027-数据故事讲述师:“数据叙事魔法师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

PostgreSQL可见性映射VM

1.可见性映射 清理过程的代价高昂&#xff0c;为了减小清理的开销&#xff0c;在PostgreSQL 8.4版中引入了VM。 VM的基本概念很简单。 每个表都拥有各自的可见性映射&#xff0c;用于保存表文件中每个页面的可见性。 页面的可见性确定了每个页面是否包含死元组。清理过程可以…

LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶飞跃——论文阅读

《LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking》2025年1月发表&#xff0c;来自浙江大学、上海AI实验室、慕尼黑工大、同济大学和中科大的论文。 尽管自动驾驶技术取得了显著进步&#xff0c;但由于推理能力有限&#xff0c;数…

二分系列题

1. 搜索插入位置 /*** 查找插入的位置&#xff1a;返回第一个大于等于 target 的索引&#xff1b;* 如果 target 大于所有元素&#xff0c;则返回数组长度&#xff08;即插入到末尾&#xff09;*/ class Solution {public int searchInsert(int[] nums, int target) {int left …

Octave 简介:一款强大的开源科学计算工具

引言 在科学计算、数据分析和数值模拟的领域&#xff0c;选择合适的工具对于提升工作效率和性能至关重要。虽然市面上有许多选择&#xff0c;但 GNU Octave 作为一款功能强大、开源免费的软件&#xff0c;它在科学计算中脱颖而出。如果你是学生、研究人员或开发者&#xff0c;…