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/8/15 22:45:30 阅读更多 →
破解物理AI技术困局(33):TVA达成意图预判与主动配合

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

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

2026/8/15 22:45:30 阅读更多 →
AI Agent白手起家74: CrewAI 核心组件详解——从智能体到知识库

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

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

2026/8/15 22:45:30 阅读更多 →

最新新闻

国内专业的地埋式水箱供应商哪家专业

国内专业的地埋式水箱供应商哪家专业

近年来,随着海绵城市建设和地下空间开发的推进,地埋式水箱在市政排水、商业综合体、工业园区等场景的需求量激增。然而,面对市场上五花八门的供应商,如何挑选真正专业、可靠的企业,成了工程方和采购方最头疼的问题。笔…

2026/8/16 0:30:01 阅读更多 →
GPTZero降AI怎么过,BunnyScholar英文最省心

GPTZero降AI怎么过,BunnyScholar英文最省心

GPTZero降AI怎么过除了 Turnitin,很多学校和写作平台也用 GPTZero 来查 AI 率。GPTZero 对英文文本特别敏感,很多同学的英文作业、论文一交上去就被标了 AI 高风险。这篇讲讲,GPTZero 降 AI 怎么过,以及为什么用 BunnyScholar 的英…

2026/8/16 0:29:01 阅读更多 →
190、LLC谐振变换器的样机调试实战(问题定位)

190、LLC谐振变换器的样机调试实战(问题定位)

190、LLC谐振变换器的样机调试实战(问题定位) 写在前面:一块冒烟的板子 上周五下午三点十七分,实验室空调坏了,我正对着第三版LLC样机发呆。示波器上那个本该平滑的正弦电流波形,此刻像得了帕金森——高频抖动叠加着莫名其妙的毛刺。更糟的是,MOSFET的散热片已经烫到能…

2026/8/16 0:21:59 阅读更多 →
188、LLC谐振变换器的样机调试实战(EMI测试)

188、LLC谐振变换器的样机调试实战(EMI测试)

188、LLC谐振变换器的样机调试实战(EMI测试) 一、从一次EMI超标说起 去年做一款300W的LLC电源,样机功能测试一切正常,效率93%,温升也OK,心里美滋滋准备送样。结果EMI预扫一上,150kHz到1MHz之间直接炸了——传导发射超标12dB,那个尖峰像一把刀插在报告上。 拆开屏蔽罩…

2026/8/16 0:21:59 阅读更多 →
VS可视化Git变基:图形界面操作指南与最佳实践

VS可视化Git变基:图形界面操作指南与最佳实践

1. 从命令行到图形界面:为什么我们需要在VS里做变基?如果你用过Git,大概率对git rebase这个命令又爱又恨。爱的是它能创造出干净、线性的提交历史,让项目脉络清晰得像一条直线;恨的是操作稍有不慎,就可能引…

2026/8/16 0:20:59 阅读更多 →
TranslucentTB完整指南:5分钟让Windows任务栏变透明的免费美化方案

TranslucentTB完整指南:5分钟让Windows任务栏变透明的免费美化方案

TranslucentTB完整指南:5分钟让Windows任务栏变透明的免费美化方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是不是也…

2026/8/16 0:16:58 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →