Spring 拦截器(Interceptor)与过滤器(Filter)对比

Spring 拦截器(Interceptor)与过滤器(Filter)对比


核心对比表格
对比维度拦截器(Interceptor)过滤器(Filter)
定义Spring MVC 提供的组件,集成于 Spring 处理器链。Servlet 规范组件,属于 Java EE 标准。
作用范围仅限于映射到 Controller 的请求(如 @RequestMapping 处理的请求)。所有请求(包括静态资源、非 Spring 处理的请求)。
执行时机Spring MVC 处理器链中执行(Controller 方法前后)。Servlet 容器启动时初始化,请求到达时立即执行(在 Spring MVC 处理器链之前)。
生命周期由 Spring 容器管理(默认单例),无显式 init()destroy() 方法。由 Servlet 容器管理,需实现 init()destroy() 方法。
核心方法preHandle(), postHandle(), afterCompletion()init(), doFilter(), destroy()
配置方式通过 WebMvcConfigurer.addInterceptors() 注册。通过 FilterRegistrationBeanweb.xml 注册。
典型使用场景权限验证、日志记录、请求参数校验、与 Spring 服务层交互。跨域处理(CORS)、日志记录、请求压缩、静态资源拦截、通用 HTTP 头处理。
依赖注入支持支持 @Autowired 等 Spring 依赖注入。需通过 FilterRegistrationBean@Component 显式注入。
执行顺序控制通过 order() 方法设置优先级(数值越小优先级越高)。通过 FilterRegistrationBean.setOrder()web.xml 的声明顺序控制。
异常处理通过 afterCompletion() 处理异常(需配合 HandlerExceptionResolver)。需在 doFilter() 中通过 try-catch 捕获异常。
性能影响仅针对 Controller 请求,性能影响较小。针对所有请求,可能影响性能(如频繁的静态资源请求)。

关键区别示例
场景 1:身份验证
  • 拦截器:适合与 Spring 服务层结合,如通过 @Autowired 注入 UserService 验证 Token。
  • 过滤器:适合通用 Token 验证(如 JWT),拦截所有请求(包括登录接口)。
场景 2:日志记录
  • 拦截器:记录 Controller 方法级别的执行时间。
  • 过滤器:记录所有请求的 URL、响应时间(包括静态资源)。
场景 3:异常处理
  • 拦截器:通过 afterCompletion() 统计接口错误率。
  • 过滤器:需在 doFilter() 中通过 try-catch 处理异常。

代码示例对比
拦截器配置
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).order(1).addPathPatterns("/**").excludePathPatterns("/login");}
}
过滤器配置
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<CorsFilter> corsFilterRegistration() {FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new CorsFilter());registration.addUrlPatterns("/*");registration.setOrder(2);return registration;}
}

生命周期对比
阶段拦截器(Interceptor)过滤器(Filter)
初始化由 Spring 容器自动初始化,无 init() 方法。需实现 init() 方法,在 Servlet 容器启动时调用。
请求处理preHandle() → Controller → postHandle()afterCompletion()doFilter() 中处理请求(需显式调用 chain.doFilter())。
销毁由 Spring 容器管理,无 destroy() 方法。需实现 destroy() 方法,在应用关闭时调用。

执行流程图
客户端请求 →
├─ Filter 的 doFilter() →
│  ├─ Filter 前置处理 →
│  │  └─ 继续 FilterChain →
│  │     ├─ Interceptor 的 preHandle() →
│  │     │  └─ 拦截器前置处理 →
│  │     │     └─ Controller 方法执行 →
│  │     │        └─ Interceptor 的 postHandle() →
│  │     │           └─ 拦截器后置处理 →
│  │     └─ Interceptor 的 afterCompletion() →
│  │        └─ 拦截器完成处理
│  └─ Filter 后置处理
└─ 响应返回

选择建议
  1. 使用拦截器的场景

    • 需要与 Spring 上下文深度集成(如依赖注入服务层)。
    • 仅需处理 Controller 映射的请求(如 /api/**)。
    • 需要细粒度控制请求生命周期(如方法执行前后校验)。
  2. 使用过滤器的场景

    • 需要拦截所有请求(包括静态资源、非 Spring 处理的请求)。
    • 需要直接操作请求/响应对象(如修改 HTTP 头、压缩响应)。
    • 需要在请求到达 Spring 处理器链之前执行逻辑(如统一日志记录)。

总结
  • 拦截器Spring MVC 的高级组件,适合与 Spring 生态深度集成,处理 Controller 层的业务逻辑。
  • 过滤器Servlet 规范的底层组件,适合通用请求处理(如跨域、日志),作用范围更广但灵活性较低。

两者可以 同时使用,形成更复杂的处理链(例如:过滤器处理跨域,拦截器处理权限验证)。

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

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

相关文章

VulnHub-FALL通关攻略

第一步&#xff1a;确定靶机IP为192.168.40.129 第二步&#xff1a;扫描后台及开放端口 #开放端口 22 --- ssh 25 --- SMTP简单邮件传输协议 80 --- HTTP万维网传输信息协议 110 --- POP3邮件协议3 139 --- NetBIOS服务 443 --- https服务 445 --- SMB协议 3306 --- Mysql 808…

Qt 线程和 QObjects

线程和 QObjects QThread 继承于 QObject。 它发出信号来指示线程开始或结束执行&#xff0c;并提供一些插槽。 更有趣的是&#xff0c;QObjects 可以在多个线程中使用&#xff0c;发出信号以调用其他线程中的插槽&#xff0c;并向 "生活 "在其他线程中的对象发布事件…

华为、浪潮、华三链路聚合概述

1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型&#xff0c;分别是手工链路聚合&#xff0c;静态lacp链路聚合&#xff0c;动态lacp链路聚合。 手工链路模式&#xff1a;也称负载分担模式&#xff0c;需手动指定链路&#xff0c;各链路之间平均分担流量。静态LAC…

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…

步进电机 cia402协议 报文自己的理解 (笔记)

1. cai402 协议是什么 CiA 402 协议&#xff08;CAN in Automation 402&#xff09;&#xff0c;它是工业自动化领域中的一种通信协议&#xff0c;主要用于运动控制&#xff08;如伺服驱动器、步进电机等&#xff09;&#xff08; &#xff09;所属标准 CiA 402 是 CANopen 应用…

鸿蒙摄像机,一场智能安防的“平权革命”

2025的春天&#xff0c;全国各行各业都感受到了普惠AI的魅力。大模型带来的技术平权&#xff0c;让每一个人都能轻松用上AI。 这时候&#xff0c;企业想知道&#xff0c;每时每刻离不开的摄像机&#xff0c;究竟什么时候才能迎来智能技术的平权与普惠。 博思数据研究中心的一份…

解决HuggingFaceEmbeddings模型加载报错:缺少sentence-transformers依赖包

遇到报错 报错信息: Error loading model: Could not import sentence_transformers python package. Please install it with pip install sentence-transformers. 装包信息&#xff1a; pip install modelscope langchain sentence_transformers langchain-huggingface on…

从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档

从泛读到精读&#xff1a;合合信息文档解析如何让大模型更懂复杂文档 一、引言&#xff1a;破解文档“理解力”瓶颈二、核心功能&#xff1a;合合信息的“破局”亮点功能亮点1&#xff1a;复杂图表的高精度解析图表解析&#xff1a;为大模型装上精准“标尺”表格数据精准还原 功…

Python+requests实现接口自动化测试框架

为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离&#xff1b;数据的变更不影响程序 3、有日志功能&#xff0c;实现无人值守 4、自动发送测试报告 5、不懂编程的测试人员也可以进行测试 正常接口测试的流程是什么&#xff1f; 确定接口测试使用的工具…

信息学奥赛一本通 1514:【例 2】最大半连通子图 | 洛谷 P2272 [ZJOI2007] 最大半连通子图

【题目链接】 ybt 1514&#xff1a;【例 2】最大半连通子图 洛谷 P2272 [ZJOI2007] 最大半连通子图 【题目考点】 1. 图论&#xff1a;强连通分量 缩点 2. 图论&#xff1a;拓扑排序 有向无环图动规 【解题思路】 对于图中任意两顶点u、v&#xff0c;满足u到v或v到u有路径…

Android打aar包问题总结

1、moduleA 依赖 moduleB&#xff0c;将moduleA打包成aar时&#xff0c;未包含 moduleB的resources资源&#xff1b; 方法一&#xff1a;将moduleB的资源&#xff0c;手动拷贝一份到moduleA中&#xff1b; 方法二&#xff1a;使用 fat-aar 插件&#xff1b; 2、fat-aar插件使…

【网络协议】【http】http 简单介绍

【网络协议】【http】http 简单介绍 1 HTTP 头部 HTTP 是一种请求-响应协议&#xff0c;客户端向服务器发送请求&#xff0c;服务器返回响应。 1.1 HTTP 状态码 状态码是服务器返回给客户端的 三位数字代码&#xff0c;用于表示请求的执行结果。 状态码按照首位数字分类&am…

谈谈空间复杂度考量,特别是递归调用栈空间消耗?

空间复杂度考量是算法设计的核心要素之一&#xff0c;递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析&#xff1a; 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作&#xff1a;递归遍历未知层级的DOM树 function countDOMNode…

LeetCode算法题(Go语言实现)_16

题目 给定一个二进制数组 nums 和一个整数 k&#xff0c;假设最多可以翻转 k 个 0 &#xff0c;则返回执行操作后 数组中连续 1 的最大个数 。 一、代码实现 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …

【数据结构】栈 与【LeetCode】20.有效的括号详解

目录 一、栈1、栈的概念及结构2、栈的实现3、初始化栈和销毁栈4、打印栈的数据5、入栈操作---栈顶6、出栈---栈顶6.1栈是否为空6.2出栈---栈顶 7、取栈顶元素8、获取栈中有效的元素个数 二、栈的相关练习1、练习2、AC代码 个人主页&#xff0c;点这里~ 数据结构专栏&#xff0c…

攻破tensorflow,勇创最佳agent(2)---损失(loss) 准确率(accuracy)问题

实战播: 怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…

pdfh5 pdf

踩坑1&#xff1a; 渲染失败 &#xff08;1&#xff09;在vue项目中&#xff0c;读取本地的pdf文件需要放到public下static文件夹中&#xff0c;不能放在别的地方&#xff1b; &#xff08;2&#xff09;引用时&#xff0c;不能使用相对路径&#xff0c;因为使用public文件下…

6.5 模拟专题:LeetCode 38. 外观数列

1. 题目链接 LeetCode 38. 外观数列 2. 题目描述 给定一个正整数 n&#xff0c;生成外观数列的第 n 项。外观数列的定义如下&#xff1a; 第 1 项为 "1"。第 n 项是对第 n-1 项的描述。例如&#xff0c;第 2 项描述第 1 项&#xff08;"1"&#xff09;为…

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能与机器人学交叉的前沿领域&#xff0c;强调智能体通过身体与环境的动态交互实现自主学习和进化&#xff0c;其核心在于将感知、行动与认知深度融合‌。通俗地讲&#xff0c;就是机器人或者智能系统在物理环境中…

git命令使用小记(打补丁)

需求&#xff1a;需要从开发分支提取本人提交代码&#xff0c;然后合并到主分支 一、制作补丁包 mkdir -p patches for commit in $(git log commitA..commitB --author"username" --reverse --prettyformat:"%h"); do …