Spring Cloud Gateway 自定义过滤器
文章目录Spring Cloud Gateway 自定义过滤器一、依赖版本二、两种自定义过滤器三、Pre 与 Post四、执行顺序五、自定义 GatewayFilter普通5.1 实现类5.2 yml 配置5.3 带参过滤器 shortcut 写法可选六、自定义 GlobalFilter全局6.1 常用 GlobalFilter 场景七、普通 vs 全局 对照示例八、完整接入步骤8.1 创建 Filter 类8.2 配置 GatewayFilter可选8.3 启动验证九、GatewayFilter 与 GlobalFilter 选型十、常见问题10.1 yml 配了 Custom 但报 Unknown filter10.2 GlobalFilter 不生效10.3 Pre 里如何中断请求10.4 Boot 4 配置不生效十一、总结Spring Cloud Gateway 自定义过滤器基于spring-cloud-demo· Spring Boot 4.1.0 Spring Cloud 2025.1.2一、依赖版本组件版本Java21Spring Boot4.1.0Spring Cloud2025.1.2Gateway 依赖spring-cloud-starter-gateway-server-webfluxBoot 4 配置前缀为spring.cloud.gateway.server.webflux.*非 Boot 3 的spring.cloud.gateway.*。二、两种自定义过滤器Gateway 内置大量 FilterAddRequestHeader、StripPrefix 等。业务需要鉴权、日志、灰度等逻辑时需自定义 Filter。对比项GatewayFilter普通GlobalFilter全局作用范围指定路由或 default-filters 全部路由所有路由实现方式继承AbstractGatewayFilterFactory实现GlobalFilterOrderedyml 配置需要filters:或default-filters:不需要注册为 Bean 即生效典型场景某条路由加参数、单路由鉴权全局日志、全站鉴权、TraceId配置写法filters: - name: Customargs无三、Pre 与 Post无论普通还是全局一次 Filter 可同时包含Pre和Post阶段时机示例Pre请求转发到后端之前鉴权、加 Header、限流Post后端响应返回客户端之前改响应头、记录耗时returnchain.filter(exchange).then(Mono.fromRunnable(()-{// Postchain.filter 之后执行}));// Prereturn 之前的代码四、执行顺序所有 Filter 合并为一条链按order 值排序order越小越先执行order相同时defaultFilterGatewayFilterGlobalFilter实现Ordered接口或加Order注解指定 order。Ordered.LOWEST_PRECEDENCE表示优先级最低最后执行。流程图见doc/gateway-diagrams.drawio→ 页「过滤器执行顺序」五、自定义 GatewayFilter普通5.1 实现类继承AbstractGatewayFilterFactoryConfig类名必须以GatewayFilterFactory结尾。yml 中的name取类名前缀CustomGatewayFilterFactory→name: Custompackagecom.emrys.gateway.filter;importlombok.Data;importlombok.extern.slf4j.Slf4j;importorg.springframework.cloud.gateway.filter.GatewayFilter;importorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;importorg.springframework.core.Ordered;importorg.springframework.stereotype.Component;importreactor.core.publisher.Mono;Slf4jComponent// 必须交给 Spring 管理publicclassCustomGatewayFilterFactoryextendsAbstractGatewayFilterFactoryCustomGatewayFilterFactory.ConfigimplementsOrdered{publicCustomGatewayFilterFactory(){super(Config.class);// 绑定配置类}OverridepublicGatewayFilterapply(Configconfig){return(exchange,chain)-{log.info([Pre] CustomFilter, name{},config.getName());// Pre转发前returnchain.filter(exchange).then(Mono.fromRunnable(()-{log.info([Post] CustomFilter done);// Post响应后}));};}OverridepublicintgetOrder(){returnOrdered.LOWEST_PRECEDENCE;// order 越大优先级越低}DatapublicstaticclassConfig{privateStringname;// 对应 yml args.name}}5.2 yml 配置只对product-route生效spring:cloud:gateway:server:webflux:routes:-id:product-route# 路由 IDuri:lb://product-service# 目标服务predicates:-Path/product/**# 路径断言filters:-AddRequestHeaderX-Request-Source,gateway# 内置过滤器-name:Custom# 自定义过滤器类名前缀args:name:custom filter# 传入 Config.name对所有路由生效写到default-filtersspring:cloud:gateway:server:webflux:default-filters:-name:Custom# 全局默认自定义过滤器args:name:global customroutes:-id:order-routeuri:lb://order-servicepredicates:-Path/order/**5.3 带参过滤器 shortcut 写法可选参数只有一个时可用简写filters:-Customcustom filter# 等价于 name: Custom args.name需在工厂类中重写shortcutFieldOrder()指定参数顺序。六、自定义 GlobalFilter全局实现GlobalFilterOrdered无需 yml注册为 Bean 后对所有路由生效。packagecom.emrys.gateway.filter;importlombok.extern.slf4j.Slf4j;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.Ordered;importorg.springframework.stereotype.Component;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;Slf4jComponent// 注册为 Bean 即全局生效publicclassCustomGlobalFilterimplementsGlobalFilter,Ordered{OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){log.info([Pre] GlobalFilter path{},exchange.getRequest().getURI().getPath());// Pre转发前returnchain.filter(exchange).then(Mono.fromRunnable(()-{log.info([Post] GlobalFilter status{},exchange.getResponse().getStatusCode());// Post响应后}));}OverridepublicintgetOrder(){returnOrdered.HIGHEST_PRECEDENCE;// 数字小 优先执行}}6.1 常用 GlobalFilter 场景场景实现要点全链路 TraceIdPre 阶段生成 UUID写入请求 Header 并放入 MDC全站鉴权Pre 阶段校验 Token失败则exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED)并return exchange.getResponse().setComplete()请求耗时Pre 记录开始时间Post 计算差值打日志七、普通 vs 全局 对照示例同时启用 CustomGatewayFilterFactory仅 product-route和 CustomGlobalFilter 时日志顺序order 相同时[Pre] CustomFilter ← GatewayFilter 先 [Pre] GlobalFilter ← GlobalFilter 后 ... 后端处理 ... [Post] GlobalFilter [Post] CustomFilter八、完整接入步骤8.1 创建 Filter 类在gateway模块下新建包com.emrys.gateway.filter编写上述两个类。8.2 配置 GatewayFilter可选在application-dev.yml的目标路由filters中添加name: Custom。8.3 启动验证# 经网关访问 productGET http://localhost:9000/product/getProductById?id1观察 gateway 日志应出现 CustomFilter / GlobalFilter 的 Pre、Post 输出。九、GatewayFilter 与 GlobalFilter 选型需求推荐只作用于/product/**GatewayFilter只作用于某几条路由GatewayFilter分别配在各路由filters作用于全部路由GlobalFilter或default-filters GatewayFilter需要 yml 传参开关、阈值GatewayFilterConfig args纯代码逻辑、全局统一GlobalFilter十、常见问题10.1 yml 配了 Custom 但报 Unknown filter类名必须以GatewayFilterFactory结尾且类上有Component/Service。10.2 GlobalFilter 不生效检查是否注册为 Spring BeanComponent且未被Conditional排除。10.3 Pre 里如何中断请求exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 设置状态码returnexchange.getResponse().setComplete();// 直接结束不调用 chain.filter10.4 Boot 4 配置不生效确认使用spring.cloud.gateway.server.webflux.routes而非旧版spring.cloud.gateway.routes。十一、总结主题GatewayFilter普通GlobalFilter全局基类/接口AbstractGatewayFilterFactoryGlobalFilterOrdered命名XxxGatewayFilterFactory→ ymlname: Xxx任意类名配置ymlfilters/default-filters无需 yml范围按路由全部路由Pre/Postchain.filter前 /.then()后相同

相关新闻

还在为Wand专业版续费?试试这款开源增强器,解锁Pro还送手机遥控

还在为Wand专业版续费?试试这款开源增强器,解锁Pro还送手机遥控

还在为Wand专业版续费?试试这款开源增强器,解锁Pro还送手机遥控 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 晚上想开两…

2026/10/9 16:45:41 阅读更多 →
破解物理AI技术困局(33):TVA达成意图预判与主动配合

破解物理AI技术困局(33):TVA达成意图预判与主动配合

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术框架。它融合深度强化学习(DRL)、卷积神经…

2026/10/7 2:57:53 阅读更多 →
AI Agent白手起家74: CrewAI 核心组件详解——从智能体到知识库

AI Agent白手起家74: CrewAI 核心组件详解——从智能体到知识库

纲要 组件概览:Agent、Task、Crew、Flow、Knowledge、MemoryAgent:团队中的最小执行单元 YAML 配置化定义纯代码定义运行代码与工具集成 Task:智能体的工作任务 配置与依赖关系结构化输出 Crew:组建专业团队 配置式与代码式两种风…

2026/9/29 19:14:53 阅读更多 →

最新新闻

当AI原生公司开始“吃掉”制片厂:影视工业的边界正在溶解

当AI原生公司开始“吃掉”制片厂:影视工业的边界正在溶解

🌊 专注 AI 大模型与前沿科技深度解析,习惯从工程师视角拆解技术热点,让我们一起在技术浪潮中保持清醒与好奇 🚀当AI原生公司开始“吃掉”制片厂:影视工业的边界正在溶解30 秒结论 本文判断:AI原生影视公司…

2026/10/15 0:49:41 阅读更多 →
从柯西-施瓦兹不等式到匹配滤波:工程直觉与实战避坑指南

从柯西-施瓦兹不等式到匹配滤波:工程直觉与实战避坑指南

简介:这份资料围绕雷达信号处理中的匹配滤波技术展开,从柯西施瓦兹不等式这一数学基础切入,帮助读者理解匹配滤波器的理论来源与工程实现。内容适合具备一定信号处理与线性代数基础的高校学生、科研人员及雷达工程从业者,用于解决…

2026/10/15 0:48:41 阅读更多 →
手写C++ OBJ文件解析器:从格式到百万顶点优化与避坑指南

手写C++ OBJ文件解析器:从格式到百万顶点优化与避坑指南

简介:面向需要处理Wavefront OBJ三维模型格式的开发者和图形学入门者,这份资源提供一套基于Visual Studio 2013的obj解析C源码。源码实现完整的读取流程,覆盖顶点、纹理坐标、法线及多边形面这几类核心指令的解析,通过文件流逐行读…

2026/10/15 0:48:41 阅读更多 →
superpowers:用SKILL.md让Claude Code变身高效率AI开发助手

superpowers:用SKILL.md让Claude Code变身高效率AI开发助手

1. 先搞清楚:superpowers 到底是什么如果你平时用 Claude Code 比较多,可能早就遇到了一个让我当初很头疼的问题:底层模型确实聪明,但你在对话里让它"做个深度调研""写一套完整的单测""把这次的改动整理…

2026/10/15 0:48:41 阅读更多 →
用repomap给Claude Code一张代码地图,工具调用从52次降到3次

用repomap给Claude Code一张代码地图,工具调用从52次降到3次

1. 52 次工具调用到底是怎么花掉的我一直觉得 Claude Code 这类 CLI 编程助手最让人上头的点是“它真的会自己去翻代码库”,但最让人血压升高的点也是“它真的会自己去翻代码库”。刚上手那会儿,我在一个两万行左右的项目里让它排查登录流程的 token 过期…

2026/10/15 0:48:41 阅读更多 →
C#调用MATLAB绘图实战:COM自动化、句柄管理与嵌入式集成

C#调用MATLAB绘图实战:COM自动化、句柄管理与嵌入式集成

简介:本资源面向C#开发者与MATLAB混合编程实践者,解决在Windows平台下利用MATLAB强大图形引擎(尤其三维可视化)弥补C#原生绘图能力不足的核心问题。适用于科学计算、工程仿真、教学演示等需高质量数学图形的中高级开发场景。压缩包…

2026/10/15 0:48:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →