拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录
- 一、拦截器(Interceptor)和过滤器(Filter):都是“守门员”!
- 二、如何实现拦截器和过滤器?
- 三、拦截器和过滤器的区别
- 四、执行顺序
- 五、真实的应用场景
- 六、总结
🌟如果喜欢作者的讲解方式,关注作者不迷路,同时也可以看看我的其他文章! 感谢!!!
🌟 从乐高积木到乐队指挥,用最通俗易懂的方式带你玩转 Spring Boot Bean!
就让我用这篇文章来讲解 SpringBoot 的拦截器和过滤器吧,给它安排明白!😎
一、拦截器(Interceptor)和过滤器(Filter):都是“守门员”!
想象一下,你的 SpringBoot 应用就像一个豪华酒店🏨。
- 过滤器(Filter): 就像酒店大门口的保安👮,负责检查所有进出酒店的人(请求)。它可以决定是否允许客人进入,或者在客人进入前做一些处理,比如检查身份证、测量体温🌡️。
- 拦截器(Interceptor): 就像酒店内部各个楼层的楼层经理👩💼,只负责检查进入特定楼层(Controller)的客人。它可以在客人进入楼层前、进入楼层后、离开楼层后都进行干预,比如登记访客信息、提供楼层指引🗺️。
二、如何实现拦截器和过滤器?
1. 过滤器(Filter):
- 步骤一: 创建一个类,实现
javax.servlet.Filter接口。 - 步骤二: 实现
doFilter()方法。这个方法就是过滤器的核心逻辑,在这里你可以对请求和响应进行处理。 - 步骤三: 使用
@WebFilter注解或者在WebConfig类中注册过滤器。
// 方式一:使用 @WebFilter 注解
@WebFilter(urlPatterns = "/*", filterName = "MyFilter") // 拦截所有请求
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器:请求来了!我要检查一下!🧐");// 可以对 request 和 response 进行处理HttpServletRequest req = (HttpServletRequest) request;String uri = req.getRequestURI();System.out.println("请求的URI:" + uri);// 放行,让请求继续往下走chain.doFilter(request, response);System.out.println("过滤器:请求走了!我要记录一下!📝");}
}// 方式二:在 WebConfig 类中注册
@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilterRegistrationBean() {FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new MyFilter());registration.addUrlPatterns("/*"); // 拦截所有请求registration.setName("MyFilter");registration.setOrder(1); // 设置优先级,数字越小优先级越高return registration;}
}
2. 拦截器(Interceptor):
- 步骤一: 创建一个类,实现
org.springframework.web.servlet.HandlerInterceptor接口。 - 步骤二: 实现
preHandle()、postHandle()、afterCompletion()方法。preHandle():在 Controller 处理请求之前调用,可以进行权限验证、参数校验等。如果返回false,则请求会被拦截,不会继续执行。postHandle():在 Controller 处理请求之后,但在视图渲染之前调用,可以对 ModelAndView 进行修改。afterCompletion():在整个请求处理完毕之后调用,可以进行资源清理、日志记录等。
- 步骤三: 创建一个配置类,实现
org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口,并重写addInterceptors()方法,将拦截器注册到 Spring 容器中。
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器:Controller 要处理请求了!我要先检查一下!👮♀️");// 可以进行权限验证、参数校验等String token = request.getHeader("token");if (token == null || token.isEmpty()) {System.out.println("拦截器:没有 token,拒绝访问!🚫");response.setStatus(401); // 返回未授权状态码return false; // 拦截请求}return true; // 放行请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("拦截器:Controller 处理完请求了!我可以修改 ModelAndView!🎨");// 可以对 ModelAndView 进行修改if (modelAndView != null) {modelAndView.addObject("message", "拦截器添加的额外信息!🎁");}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器:请求处理完成了!我可以清理资源、记录日志!🧹");// 可以进行资源清理、日志记录等}
}@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**") // 拦截 /api/ 下的所有请求.excludePathPatterns("/api/login"); // 排除 /api/login 请求}
}
三、拦截器和过滤器的区别
| 特性 | 过滤器(Filter) | 拦截器(Interceptor) |
|---|---|---|
| 实现方式 | 实现 javax.servlet.Filter 接口 | 实现 org.springframework.web.servlet.HandlerInterceptor 接口 |
| 拦截范围 | 拦截所有进出 Servlet 容器的请求 | 拦截特定的 Controller 方法 |
| 执行时机 | 在 DispatcherServlet 之前和之后执行 | 在 Controller 方法执行之前、之后和完成之后执行 |
| 依赖性 | 不依赖 Spring 容器 | 依赖 Spring 容器,可以访问 Spring 上下文 |
| 功能 | 字符编码转换、请求内容过滤、敏感词过滤等 | 权限验证、日志记录、参数校验等 |
| 精确度 | 粗粒度,只能拦截 URL | 细粒度,可以访问 HandlerMethod,获取方法信息 |
总结:
- 过滤器: 拦截所有请求,不依赖 Spring,功能比较通用。
- 拦截器: 拦截特定 Controller 方法,依赖 Spring,功能更精细。
四、执行顺序
- 过滤器(Filter):在 DispatcherServlet 之前执行。
- 拦截器(Interceptor):
preHandle():在 Controller 方法执行之前执行。- Controller 方法执行。
postHandle():在 Controller 方法执行之后,但在视图渲染之前执行。- 视图渲染。
afterCompletion():在整个请求处理完毕之后执行。
记住: 多个过滤器和拦截器可以配置执行顺序,通常通过 order 属性或者 @Order 注解来设置,数字越小优先级越高。
五、真实的应用场景
- 过滤器:
- 字符编码转换: 统一设置请求和响应的字符编码,避免乱码。
- XSS 攻击防御: 过滤请求中的恶意脚本,防止 XSS 攻击。
- 日志记录: 记录所有请求的 URL、IP 地址等信息。
- 拦截器:
- 权限验证: 检查用户是否已登录,是否有权限访问特定资源。
- 参数校验: 校验请求参数的合法性,防止恶意请求。
- 性能监控: 记录 Controller 方法的执行时间,分析性能瓶颈。
- 防止重复提交: 避免用户重复提交表单。
六、总结
- 过滤器: 就像酒店大门口的保安,啥人都拦,主要做一些通用的检查,比如身份证、体温啥的。
- 拦截器: 就像楼层经理,只管特定楼层的人,可以做更细致的检查,比如登记访客信息、提供楼层指引。
- 执行顺序: 先保安,再楼层经理。保安先检查,楼层经理在客人进房间前、进房间后、离开房间后都可以管。
如果编写了AOP逻辑,会在拦截器之后执行,相关内容请看:
🔗被重复代码逼疯?AOP来当“舔狗”!日志/事务/权限,随叫随到!
希望这篇文章能让你有趣的理解 SpringBoot 的拦截器和过滤器!🎉🎉🎉
相关文章:
拦截器VS过滤器:Spring Boot中请求处理的艺术!
目录 一、拦截器(Interceptor)和过滤器(Filter):都是“守门员”!二、如何实现拦截器和过滤器?三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 🌟如果喜欢作者的讲…...
C语言预处理学习笔记
1. 预处理器的功能 预处理器(Preprocessor)在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头,主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容,通常用…...
LLM基础环境准备-云服务器
软件环境 腾讯云 操作系统: TencentOS Server 3.1 (TK4) Python: 3.9.0(使用 conda的虚拟python环境,可根据实际需要更换版本,当前使用的是3.9.0的版本) CUDA Version: 12.2(腾讯云会自动安装) Driver Version: 5…...
网络协议相关知识有哪些?
前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...
基于Llama 3.2-Vision的医学报告生成
记录运用大模型解决医学报告实例,仅介绍本地调用的情况。 前情提要 已安装 Python 显存不少于8G(8G设备上测试成功,其他环境可以自行测试)。 需要安装Ollama (Ollama 是一个允许在本地运行多模态模型的平台)。 方式1࿱…...
离线部署大模型:ollama+deepseek+open-webui
ollama 是一个开源的本地大语言模型运行框架,它提供了非常简单便捷的使用形式,让用户可以十分方便的在本地机器上部署和运行大型语言模型,从而实现免费离线的方式使用 LLM 能力,并确保私有数据的隐私和安全性。 1 ollama 安装 o…...
如何看nginx.conf文件?
是的,你的理解是对的!在 Nginx 配置中,最内层的 location 确实是决定请求最终处理的“入口”。当请求进入 Nginx 时,Nginx 会根据请求的路径(即 URL)匹配 location 块,然后按照匹配的顺序逐层向…...
3月营销日历:开启春日盛宴,绽放生活魅力
关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰:如轻薄外套、春装等,适合惊蛰后的市场需求; 美妆护肤:妇女节期间…...
pdf预览在vue项目中的使用兼容ie浏览器
一、下载pdf预览插件 链接: https://pan.baidu.com/s/1wuzay-saAfiqtS-efd-cvw?pwd6m78 提取码: 6m78 二、创建一个pdf文件夹,将下载下来的文件build和web文件夹复制到pdf文件夹下 三、项目中使用 (路径由两部分组成,第一部分是项目存放pdf插件的路径…...
Unity面板介绍_Project工程面板(23.1.1)
一、project(工程界面) 显示当前工程所有资源文件(场景、脚本、音频、图片。。) Assets资源文件、Library库文件、Project setting项目设置、Temp临时文件 二、面板大致...
使用Termux将安卓手机变成随身AI服务器(page assist连接)
通过以下方法在安卓手机上运行 Ollama 及大模型,无需 Root 权限,具体方案如下: 通过 Termux 模拟 Linux 环境运行 核心工具: 安装 (安卓终端模拟器)()]。借助 proot-distro 工具安装 Linux 发行版…...
MacOS安装Emacs
个人博客地址:MacOS安装Emacs | 一张假钞的真实世界 在MacOS X上可以使用Homebrew 安装Emacs: $ brew install emacs --with-cocoa 或者用MacPorts: $ sudo port install emacs-app OSX Emacs 网站提供了通用的二进制包。 前两种方法安装…...
OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::TrainData 类是 OpenCV 机器学习模块中用于表示训练数据的一个核心类。它封装了样本数据、响应(标签)、样本权重…...
3.1 actor基本框架(c#的Akka.Actor模式)
1.最简单的一个框架 代码如下(代码容易理解): using System; using Akka.Actor; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography.X509Certi…...
Git使用[同一电脑多个账户ssh-key的管理]
同一电脑多个账户ssh-key的管理 现在遇到一个问题,我同一台电脑既要通过VPN访问内网的git也要访问对外释放的gitee,刚开始我直接把原来的SSH-key添加到内网的gitlab发现可以访问,但是后来再方位外网的gitee就出问题了,看来要换一种手段才行 本文引用:https://cloud…...
使用Python结合`stable-baselines3`库(包含PPO和TD3算法)以及`gym`库来实现分层强化学习的示例代码
以下是一个使用Python结合stable-baselines3库(包含PPO和TD3算法)以及gym库来实现分层强化学习的示例代码。该代码将环境中的动作元组分别提供给高层处理器PPO和低层处理器TD3进行训练,并实现单独训练和共同训练的功能。 代码实现 import g…...
【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba
【引用格式】:Ryoo K, Lim H, Myung H. MambaGlue: Fast and Robust Local Feature Matching With Mamba[J]. arXiv preprint arXiv:2502.00462, 2025. 【网址】:https://arxiv.org/pdf/2502.00462 【开源代码】:https://github.com/uri-Ka…...
基于 Stanford CoreNLP 的中文自然语言处理
一、概述 Stanford CoreNLP 是斯坦福大学开发的一款强大的自然语言处理(NLP)工具,支持多种语言的文本处理,包括中文。本文将详细介绍如何使用 Stanford CoreNLP 实现中文文本的分词、词性标注、命名实体识别、句法分析等功能&…...
python 量化交易入门到提升详细教程,python量化交易教程
文章目录 前言入门阶段1. 环境准备安装 Python选择开发环境安装必要的库 2. 金融数据获取3. 简单策略构建 - 移动平均线交叉策略 进阶阶段1. 策略回测2. 风险管理3. 多因子策略4. 机器学习在量化交易中的应用5. 高频交易策略 前言 Python 作为一门功能强大、易于学习且应用广泛…...
如何设置爬虫的访问频率?
设置爬虫的访问频率(即请求间隔)是确保爬虫稳定运行并避免对目标服务器造成过大压力的关键步骤。合理的访问频率不仅可以减少被目标网站封禁IP的风险,还能提高爬虫的效率。以下是一些设置爬虫访问频率的方法和最佳实践: 1. 使用s…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
