SpringBoot 拦截器高级篇
Springboot 拦截器
- 定义
- 使用场景
- 拦截器与过滤器的区别
- 实现步骤
- 全局拦截器的局限性
- 全局拦截器VS局部拦截器
- 局部拦截器
- 自定义局部拦截器
- 使用多个局部拦截器
定义
拦截器是Spring MVC框架中的一个重要组件,它是一种
AOP(面向切面编程)的实现方式,专门拦截对控制层的请求。拦截器可以用于判断用户权限、拦截WebSocket请求等。
使用场景
Springboot拦截器具有多种作用,主要包括请求预处理、请求日志记录、鉴权和权限控制、异常处理等。拦截器是一种特殊的组件,可以在请求处理的过程中对请求和响应进行拦截和处理。在不修改原有代码的情况下,实现对请求和响应的统一处理。
拦截器与过滤器的区别
- 拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
- 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
- 拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
- 拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
实现步骤
- 实现
HandlerInterceptor接口。 - 将拦截器加入
WebMvcConfigrer。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截 System.out.println("Pre Handle method is Calling"); return true; // 返回true表示继续向下执行,返回false则中断执行。 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后,但在视图渲染之前进行拦截 System.out.println("Post Handle method is Calling"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求结束之后进行拦截,即在DispatcherServlet渲染了对应的视图之后执行。 System.out.println("Request and Response is completed"); }
}
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 添加全局拦截registry.addInterceptor(new MyInterceptor());}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {}
}
全局拦截器的局限性
每个请求方法都会执行拦截器处理,增加项目性能消耗
全局拦截器VS局部拦截器
局部拦截器
要求如下:
- 执行特定方法才执行拦截器处理
- 不同方法可执行不同拦截器处理
- 单个方法可能要求多个业务类型拦截处理(比如同时需要执行耗时统计和记录日志)
那如何实现这样的局部拦截器呢,很简单,只要使用 Acri 框架处理即可,使用方式如下:
- 引入依赖
<dependency><groupId>cn.fntop</groupId><artifactId>acri-core</artifactId><version>1.0.0</version>
</dependency>
- 注册
AcriIntercepter拦截器
@Configuration
public class AcriConfig implements WebMvcConfigurer, ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 全局拦截registry.addInterceptor(new AcriIntercepter(applicationContext));}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}
- 使用
@Acri注解
| 配置项 | 默认值 | 备注 |
|---|---|---|
| value | null | 具体拦截处理器,实现AcriProcessor并注入Spring容器 |
| before | false | 是否处理请求前执行doBefore方法 |
| during | false | 是否处理请求方法后执行doDuring方法 |
| after | false | 是否在返回响应后执行doAfter方法 |
@Acri(value = AcriStopWatchProcessor.class, before = true, during = true, after = true)
@GetMapping("/login")
public String login() {log.info("登录中");return "登录成功";
}
AcriStopWatchProcessor是框架自带的耗时统计拦截
before = true //请求之前执行AcriStopWatchProcessor.doBefore()方法
自定义局部拦截器
- 实现
implements AcriProcessor并注入Spring容器
@Slf4j
@Component
public class LogProcessor implements AcriProcessor {@Overridepublic void doBefore(HttpServletRequest request, HttpServletResponse response, Object handler) {log.info("doBefore");}@Overridepublic void doDuring(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {log.info("doDuring");}@Overridepublic void doAfter(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {log.info("doAfter");}
}
- 使用
//表示请求前执行LogProcessor.doBefore方法,请求后执行LogProcessor.doAfter()方法
//during=false表示不执行doDuring方法
@Acri(value = LogProcessor.class, before = true, during = false, after = true)
@GetMapping("/login")
public String login() {log.info("登录中");return "登录成功";
}
- 效果

使用多个局部拦截器
@Acries(more = {@Acri(value = AcriStopWatchProcessor.class, before = true, after = true)
, @Acri(value = LogProcessor.class, before = true, after = true)})
详细文档参考:Acri
相关文章:
SpringBoot 拦截器高级篇
Springboot 拦截器 定义使用场景拦截器与过滤器的区别实现步骤全局拦截器的局限性全局拦截器VS局部拦截器局部拦截器自定义局部拦截器使用多个局部拦截器 定义 拦截器是Spring MVC框架中的一个重要组件,它是一种AOP(面向切面编程)的实现方式&…...
Android frameworks 开发总结之十(lock screen message Battery Last full charge)
1.設置lock screen message後不显示 XXXt設備設置lock screen message後,發現鎖頻界面不顯示內容,像時間日期都不顯示。只在右上角顯示一個鎖圖標,需要向下滑動一下才能顯示出來。布局文件位置: frameworks/base/packages/SystemUI/res-keygu…...
[建议收藏] 一个网站集合所有最新最全的AI工具
今天给大家推荐一个宝藏的AI工具合集网站,有了这个网站,你们再也不用去其他地方找AI工具了。 名称:AI-BOT工具集 这个网站精选1000AI工具,并持续每天更新添加,包括AI写作、AI绘画、AI音视频处理、AI平面设计、AI自动编…...
嵌入式硬件基础知识——1
目录 SOC、MCU、MPU、CPU SPI STM32的时钟系统 can是什么 串口和并口 传感器输出引脚高阻抗好还是低阻抗好? iic 运算放大器特点 MOS管和三极管 同步电路和异步电路 SOC、MCU、MPU、CPU SOC 片上系统 手机的核心芯片 MCU 微控系统 单片机 MPU 嵌入式微处…...
Spring如何在多线程下保持事务的一致性
Spring如何在多线程下保持事务的一致性 方法:每个线程都开启各自的事务去执行相关业务,等待所有线程的业务执行完成,统一提交或回滚。 下面我们通过具体的案例来演示Spring如何在多线程下保持事务的一致性。 1、项目结构 2、数据库SQL CR…...
外部中断为什么会误触发?
今天在写外部中断的程序的时候,发现中断特别容易受到干扰,我把手放在对应的中断引脚上,中断就一直触发,没有停过。经过一天的学习,找到了几个解决方法,所以写了这篇笔记。如果你的中断也时不时会误触发&…...
【数据库】聊聊一颗B+树 可以存储多少数据
我们知道数据库使用的数据结构是B树,但是B树可以存储多少数据呢,在面试中也是经常会问的问题,所以我们从根上理解这个问题。 操作系统层面 数据都是存储在磁盘中的,而磁盘中的数据都是以最新单位扇区进行分割。一个扇区的大小是…...
【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
Python web自动化测试 —— 文件上传
文件上传三种方式: (一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传 方法:和用户输入是一样的,使用send_keys 步骤:1、找到定位元素,2&#…...
wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie,C#后台执行js
目录 框架信息:MainWindow.xamlMainWindow.xaml.cs爬取逻辑模拟登录拦截请求Cookie获取 CookieVisitorHandle 框架信息: CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…...
【代码随想录刷题】Day18 二叉树05
文章目录 1.【513】找树左下角的值1.1题目描述1.2 解题思路1.2.1 迭代法思路1.2.2 递归法思路 1.3 java代码实现1.3.1 迭代法java代码实现1.3.2 递归法java代码实现 2. 【112】路径总和2.1题目描述2.2 解题思路2.3 java代码实现 3.【106】从中序与后序遍历序列构造二叉树3.1题目…...
2023.11.25更新关于mac开发APP(flutter)的笔记与整理(实机开发一)
我自己写的笔记很杂,下面的笔记是我在chatgpt4的帮助下完成的,希望可以帮到正在踩坑mac开发APP(flutter)的小伙伴 目标:通过MAC电脑使用flutter框架开发一款适用于苹果手机的一个APP应用 本博客的阅读顺序是…...
万宾科技可燃气体监测仪的功能有哪些?
随着城市人口的持续增长和智慧城市不断发展,燃气作为一种重要的能源供应方式,已经广泛地应用于居民生活和工业生产的各个领域。然而燃气泄漏和安全事故的风险也随之增加,对城市的安全和社会的稳定构成了潜在的威胁。我国燃气管道安全事故的频…...
Binlog vs. Redo Log:数据库日志的较劲【高级】
🎏:你只管努力,剩下的交给时间 🏠 :小破站 Binlog vs. Redo Log:数据库日志的较劲【高级】 前言第一:事务的生命周期事务的生命周期Binlog和Redo Log记录事务的一致性和持久性Binlog的记录过程R…...
移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS
目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…...
消息中间件——RabbitMQ(四)命令行与管控台的基本操作!
前言 在前面的文章中我们介绍过RabbitMQ的搭建:RabbitMQ的安装过以及各大主流消息中间件的对比:,本章就主要来介绍下我们之前安装的管控台是如何使用以及如何通过命令行进行操作。 1. 命令行操作 1.1 基础服务的命令操作 rabbitmqctl sto…...
性能压测工具:wrk
一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平…...
[Matlab有限元分析] 2.杆单元有限元分析
1. 一维杆单元有限元分析程序 一维刚单元的局部坐标系(单元坐标系)与全局坐标系相同。 1.1 线性杆单元 如图所示是一个杆单元,由两个节点i和j,局部坐标系的X轴沿着杆的方向,由i节点指向j节点,每个节点有…...
透过对话聊天聊网络tcp三次握手四次挥手
序 说起来网络,就让我想起的就是一张图。我在网上可以为所欲为,反正你又不能顺着网线来打我。接下来我们来详细说一下网络到底是怎么连接的。 TCP三次打招呼 首先我会用男女生之间的聊天方式,来举一个例子。 从tcp三次握手来说,…...
项目管理套路:看这一篇绝对够用❤️
写论文必不可少的,就是创建代码并进行实验。好的项目管理可以让实验进行得更加顺利。本篇博客以一次项目实践为例,介绍项目管理的方法,以及可能遇到的问题,并提供一些可行的解决方案。 目录 项目管理工具开始第一步版本管理十分关…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
