在 Spring Boot 中使用 WebFilter:实现请求拦截、日志记录、跨域处理等通用逻辑!
💡 前言
在开发 Web 应用时,我们经常需要对所有请求进行统一处理,例如:
- 记录请求日志
- 实现跨域(CORS)
- 接口权限控制
- 请求参数预处理
- 防止 XSS 攻击
这些功能如果都写在每个 Controller 或 Service 里,不仅代码冗余,还难以维护。
幸运的是,Spring Boot 提供了两种强大的拦截机制:
- Filter(过滤器)
- Interceptor(拦截器)
本文将重点讲解 如何在 Spring Boot 中使用 WebFilter
实现全局的请求过滤逻辑,并结合实际案例带你掌握 Filter 的高级用法。
🧪 一、什么是 WebFilter?
✅ 定义:
WebFilter
是 Java Servlet 标准中的一个接口,用于在请求到达 Controller 之前或响应返回客户端之前执行一些通用操作。
它属于 Servlet 过滤器,比 Spring 的拦截器更早介入请求流程。
✅ 生命周期:
Filter 的生命周期由 Servlet 容器管理,主要包括三个阶段:
- init() 初始化方法,在 Web 应用启动时调用一次。
- doFilter() 核心方法,每次请求都会经过此方法。
- destroy() 销毁方法,在应用关闭时调用。
🛠️ 二、Spring Boot 中配置 WebFilter 的方式
方式一:通过 @WebFilter 注解 + @ServletComponentScan(不推荐)
@WebFilter("/*")
public class LoggingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("【Filter】请求开始:" + ((HttpServletRequest) request).getRequestURI());chain.doFilter(request, response);System.out.println("【Filter】请求结束");}
}
然后在主类上添加:
@SpringBootApplication
@ServletComponentScan
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
📌 缺点:
- 不支持依赖注入(如注入 Service、Mapper 等)
- 无法灵活控制顺序和路径匹配
方式二:注册 FilterRegistrationBean(推荐)
这是 Spring Boot 官方推荐的方式,支持依赖注入,并且可以灵活控制 Filter 的顺序、URL 模式等。
示例:自定义日志记录 Filter
@Component
public class RequestLoggingFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class);@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String uri = httpRequest.getRequestURI();long startTime = System.currentTimeMillis();chain.doFilter(request, response);long duration = System.currentTimeMillis() - startTime;logger.info("请求 URI: {}, 耗时: {} ms", uri, duration);}
}
注册 Filter:
@Configuration
public class FilterConfig {@Autowiredprivate RequestLoggingFilter requestLoggingFilter;@Beanpublic FilterRegistrationBean<RequestLoggingFilter> loggingFilterRegistration() {FilterRegistrationBean<RequestLoggingFilter> registration = new FilterRegistrationBean<>();registration.setFilter(requestLoggingFilter);registration.addUrlPatterns("/*"); // 所有请求都经过该过滤器registration.setOrder(1); // 设置优先级,数字越小越先执行return registration;}
}
🎯 三、WebFilter 典型应用场景实战
✅ 场景一:请求日志记录(已演示)
适用于记录请求 URL、IP、耗时、用户信息等,便于排查问题和性能分析。
✅ 场景二:跨域请求处理(CORS)
如果你不想使用 @CrossOrigin
注解逐个设置接口跨域,也可以统一在 Filter 中处理:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest request = (HttpServletRequest) req;response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {response.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(req, res);}
}
✅ 场景三:防止 XSS 攻击
可以通过重写 getParameter()
方法来清理用户输入,避免脚本注入攻击。
public class XssFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(request);filterChain.doFilter(xssRequest, response);}
}
其中 XssHttpServletRequestWrapper
是一个继承 HttpServletRequestWrapper
的包装类,用于对参数进行转义处理。
✅ 场景四:限流与防刷接口
结合 Redis,我们可以实现简单的请求频率限制:
String ip = request.getRemoteAddr();
String key = "request_limit:" + ip;Long count = redisTemplate.opsForValue().increment(key, 1);
if (count != null && count > 100) {response.getWriter().write("{\"code\":429,\"message\":\"请求过于频繁\"}");return;
}
redisTemplate.expire(key, 1, TimeUnit.MINUTES);
🧭 四、Filter vs Interceptor 对比
功能 | Filter | Interceptor |
---|---|---|
所属框架 | Servlet 标准 | Spring MVC |
可否注入 Spring Bean | ❌ 默认不行(除非手动注册为 Bean) | ✅ 可以注入 |
可否访问 Controller 方法 | ❌ 不能获取方法名、注解等 | ✅ 可以获取 |
是否支持 AOP | ❌ | ✅ |
执行时机 | 更早于 Interceptor | |
适用场景 | 跨域、日志记录、XSS、限流 | 登录校验、权限控制、接口埋点 |
📌 建议:
- 如果只是做一些通用的请求拦截(如日志、跨域),推荐使用 Filter;
- 如果要根据业务逻辑做精细控制(如登录验证、权限判断),推荐使用 Interceptor。
📘 五、总结对比表@
内容 | 说明 |
---|---|
Filter 类型 | Servlet 标准,非 Spring 特有 |
注册方式 | 使用 FilterRegistrationBean 最佳实践 |
执行顺序 | 多个 Filter 按 setOrder() 顺序执行 |
典型用途 | 日志记录、跨域处理、XSS 防御、限流 |
优点 | 统一处理所有请求,解耦业务逻辑 |
缺点 | 无法直接使用 Spring IOC 容器中的 Bean(需额外封装) |
🎁 六、结语
Filter 是构建健壮、安全、可维护的 Spring Boot 应用中不可或缺的一环。通过合理使用 WebFilter,你可以轻松实现跨域、日志记录、请求过滤、安全防护等功能,提升系统的稳定性和安全性。
无论你是开发企业级后台系统,还是搭建对外 API 平台,都应该掌握 Filter 的使用技巧。
🎯 点赞、收藏、转发本文,让更多开发者受益!
相关文章:
在 Spring Boot 中使用 WebFilter:实现请求拦截、日志记录、跨域处理等通用逻辑!
💡 前言 在开发 Web 应用时,我们经常需要对所有请求进行统一处理,例如: 记录请求日志实现跨域(CORS)接口权限控制请求参数预处理防止 XSS 攻击 这些功能如果都写在每个 Controller 或 Service 里&#x…...
CSS预处理器:Sass与Less的语法和特性(含实际案例)
Sass(SCSS语法示例) 1. 变量:统一管理颜色 // 定义变量 $primary-color: #1a237e; $success-color: #4caf50; $font-size-base: 16px;// 实际应用 body {color: $primary-color;font-size: $font-size-base; }.button {background: $succes…...

QT常用控件(1)
控件是构成QT的基础元素,例如Qwidget也是一个控件,提供了一个‘空’的矩形,我们可以往里面添加内容和处理用户输入,例如:按钮(QpushButton),基础显示控件(Lableÿ…...

明基编程显示器终于有优惠了,程序员快来,错过等一年!
最近618的活动已经陆续开始了,好多人说这是买数码产品的好时候,作为一名资深程序员,我做了不少功课,决定给自己升级办公设备,入手明基 RD 系列的显示器,这是市面上首家专注于我们程序员痛点和需求的产品&am…...

【计算机网络】非阻塞IO——select实现多路转接
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹:【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机 🔖流水不争࿰…...
Figma 中构建 Master Control Panel (MCP) 的完整设计方案
以下是在 Figma 中构建 Master Control Panel (MCP) 的完整设计方案,专为设计系统管理而优化: 一、MCP 核心功能架构 #mermaid-svg-iZAnYxyYU4BtpeaE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…...
什么是权威解析服务器?权威解析服务器哪些作用?
域名系统(DNS)是互联网的核心基础设施之一,它将易于记忆的域名转换为计算机能够识别的IP地址。DNS服务器在这一过程中扮演着至关重要的角色,它们可以分为以下几种类型: 根DNS服务器 根DNS服务器位于DNS层级结构的最顶端…...

LeetCode--23.合并k个升序链表
解题思路: 1.获取信息: 给出了多个升序链表,要求合并成一个升序链表,返回首元结点 2.分析题目: 外面在21题的时候,讲了怎样合并两个升序链表为一个升序链表,不了解的,建议去看一下21…...
ComfyUI 工作流
目录 🧠 ComfyUI 是什么? ComfyUI 的特点 🔧 ComfyUI 工作流程(节点图) 📌 简单理解 如何安装? 🧠 ComfyUI 是什么? ComfyUI 是一个 Stable Diffusion 的图形化用户界面(GUI),专门用来生成图像。它通过 节点图(Node Graph)形式来让用户定义图像生成的每…...
使用glide 同步获取图片
在 Glide 中,可以使用asBitmap()方法来获取图片的Bitmap对象,进而同步地加载图片。以下是具体示例: String imageUrl "https://example.com/image.jpg"; Bitmap bitmap Glide.with(context).asBitmap().load(imageUrl).apply(ne…...

【推荐算法】NeuralCF:深度学习重构协同过滤的革命性突破
NeuralCF:深度学习重构协同过滤的革命性突破 一、算法背景知识:协同过滤的演进与局限1.1 协同过滤的发展历程1.2 传统矩阵分解的缺陷 二、算法理论/结构:NeuralCF架构设计2.1 基础NeuralCF结构2.2 双塔模型进阶结构2.3 模型实现流程对比 三、…...

负载均衡相关基本概念
负载均衡在系统架构设计中至关重要,其核心目标是合理分配负载,提升系统整体性能和可靠性。本文简要介绍了负载均衡的基本概念,包括四层和七层负载均衡、负载均衡的使用场景和实现方式、负载均衡的常用算法以及一些配置相关知识。 1、负载均衡…...
服务器中日志分析的作用都有哪些
服务器日志是用来检测和排查可疑行为的主要工具,运维团队可以通过分析和解读日志文件,发现服务器中潜在的网络安全威胁或异常活动,下面,就让小编和大家一起来了解一下服务器中日志分析的作用都有什么吧! 对于服务器中的…...
【React】useId
在 React 中,useId 是 React 18 引入的一个 Hook,用于生成一个在组件生命周期中保持稳定的唯一 ID。它主要用于: 无障碍(accessibility)场景,比如表单控件需要一个 id 和 label 的 htmlFor 属性配对。服务…...
【51单片机】0. 基础软件安装
最近心血来潮对单片机感兴趣,想着以后工作不景气了就跳槽,兴趣使然为以后做打算吧,开始跟着江科大学习单片机 1. 需要安装的软件说明 使用到的软件包括: Keli:写嵌入式代码的 stc-isp:烧录&下载代码…...

集成电路设计:从概念到实现的完整解析优雅草卓伊凡
集成电路设计:从概念到实现的完整解析优雅草卓伊凡 一、集成电路设计:芯片制造的”灵魂蓝图” 1.1 什么是集成电路设计? 集成电路(IC)设计是指通过电子设计自动化(EDA)工具,将数百…...

动态规划之网格图模型(二)
文章目录 动态规划之网格图模型(二)LeetCode 931. 下降路径最小和思路Golang 代码 LeetCode 2684. 矩阵中移动的最大次数思路Golang 代码 LeetCode 2304. 网格中的最小路径代价思路Golang 代码 LeetCode 1289. 下降路径最小和 II思路Golang 代码 LeetCod…...
uniapp 集成腾讯云 IM 消息搜索功能
UniApp 集成腾讯云 IM 消息搜索功能实战指南 一、功能实现原理 腾讯云 IM 通过 消息漫游 服务端搜索接口 实现消息检索,核心机制如下: 数据存储:消息默认存储7天(可扩展至30天)索引构建:基于消息内容自…...

robot_lab——rsl_rl的train.py整体逻辑
文章目录 Go2机器人训练流程详细分析概述1. 训练启动流程1.1 命令行参数解析RSL-RL相关参数组Isaac Sim应用启动参数组 1.2 RL配置1.3 Isaac Sim启动 2. 环境配置加载2.1 Hydra配置系统 3. 环境创建与初始化3.1 Gym环境创建3.2 Manager系统初始化3.2.1 ObservationManager3.2.2…...
AI推荐系统演进史:从协同过滤到图神经网络与强化学习的融合
每一次滑动手机屏幕,电商平台向你推荐心仪商品的背后,是超过百亿量级的浮点运算。从早期的“猜你喜欢”到如今的“比你更懂你”,商品推荐引擎已悄然完成从简单规则到深度智能的技术跃迁。 一、协同过滤:推荐系统的基石与演进 协同…...
Java-IO流之压缩与解压缩流详解
Java-IO流之压缩与解压缩流详解 一、压缩与解压缩概述1.1 基本概念1.2 Java中的压缩类库1.3 核心类与接口 二、ZIP压缩与解压缩2.1 ZIP格式简介2.2 使用ZipOutputStream创建ZIP文件2.3 使用ZipInputStream读取ZIP文件 三、GZIP压缩与解压缩3.1 GZIP格式简介3.2 使用GZIPOutputS…...

.NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库
在人工智能AI和机器学习ML迅猛发展的今天,数据的存储和检索需求发生了巨大变化。传统的数据库擅长处理结构化数据,但在面对高维向量数据时往往力不从心。向量数据库作为一种新兴技术,专为AI应用设计,能够高效地存储和查询高维向量…...
有声书画本
有声书画本服务标准 有声喵连接 一、基础服务(5r/w字) 核心: 基础删(快捷键AltD)调,优化播讲流畅度 执行: 删除冗余旁白 删除角色动作/心理的重复描述(例:小明冷笑道…...
StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台
## 引言:数据湖的挑战与演进 在数据驱动的时代,企业数据湖需要同时满足海量存储、高性能查询、多引擎协作和实时更新等复杂需求。传统基于 Hive 的数据湖方案面临元数据管理低效、缺乏 ACID 事务支持、查询性能瓶颈等问题。在此背景下,**Sta…...
WebRTC 与 WebSocket 的关联关系
WebRTC(Web Real-Time Communication)与 WebSocket 作为重要技术,被广泛应用于各类实时交互场景。虽然它们在功能和特性上存在明显差异,但在实际应用中也有着紧密的关联,共同为用户提供流畅的实时交互体验。 一、WebR…...

8.RV1126-OPENCV 视频中添加LOGO
一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能,然后创建两个线程:1.把LOGO灰度化,然后获取VI原始数据,其次把VI数据Mat化并创建一个感兴趣区域,最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…...

API管理是什么?API自动化测试怎么搭建?
目录 一、API管理是什么 (一)API管理的定义 (二)API管理的重要性 二、API管理的主要内容 (一)API设计 1. 遵循标准规范 2. 考虑可扩展性 3. 保证接口的易用性 (二)API开发 …...
Next.js+prisma开发一
1.初始化Next.js项目 #按版本安装 npx create-next-app13.4.5 如果最新版本 执行:npx create-next-applatest2. 安装Prima和客户端 npm install prisma --save-dev npm install prisma/client3.初始化Prisma,以SQLit举例 # 初始化 Prisma 并配置 SQLi…...

GIC v3 v4 虚拟化架构
ARMV8-A架构中包含了对虚拟化的支持。为了与架构保持匹配,GICV3也对虚拟化做了支持。新增了以下特性: 对CPU interface的硬件虚拟化虚拟中断maintenance 中断:用于通知监管程序(例如hypervisor)一些特定的虚拟机事件 …...

2025远离Deno和Fresh
原创作者:庄晓立(LIIGO) 原创时间:2025年6月6日 原创链接:https://blog.csdn.net/liigo/article/details/148479884 版权所有,转载请注明出处! 相识 Deno,是Nodejs原开发者Ryan Da…...