如何在 Spring Cloud Gateway 中创建全局过滤器、局部过滤器和自定义条件过滤器
Spring Cloud Gateway 是一个功能强大的 API 网关,能够处理 HTTP 请求、响应及路由。通过过滤器机制,您可以在请求和响应过程中进行各种处理操作,如记录日志、身份验证、限流等。Spring Cloud Gateway 提供了三种主要类型的过滤器:全局过滤器、局部过滤器和自定义条件过滤器。本文将详细介绍如何在 Spring Cloud Gateway 中创建和使用这些过滤器。
1. 全局过滤器(Global Filter)
全局过滤器是应用于所有请求的过滤器,无论请求被路由到哪个目标服务,都会先经过这些过滤器。全局过滤器适用于需要对所有请求进行操作的场景,如日志记录、请求限流、身份验证等。
创建全局过滤器的步骤
步骤 1:实现 GlobalFilter 接口
要创建全局过滤器,您需要实现 GlobalFilter 接口,并重写 filter 方法。以下是一个简单的全局过滤器,它记录请求的开始时间,并在请求完成后输出请求的处理时长。
示例代码:全局过滤器
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import reactor.core.publisher.Mono;
import lombok.extern.slf4j.Slf4j;@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 记录开始时间long startTime = System.currentTimeMillis();exchange.getAttributes().put("startTime", startTime);// 继续执行后续过滤器return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 计算并输出请求时长long endTime = System.currentTimeMillis();long duration = endTime - startTime;log.info("Request completed in " + duration + "ms");}));}
}
步骤 2:设置过滤器的执行顺序(可选)
GlobalFilter 接口继承自 Ordered 接口,您可以通过 getOrder() 方法设置过滤器的执行顺序。返回值越小,优先级越高。
@Override
public int getOrder() {return -1; // 高优先级
}
步骤 3:配置全局过滤器
使用 @Component 注解注册全局过滤器,Spring 会自动将其作为全局过滤器进行管理。
2. 局部过滤器(Local Filter)
局部过滤器是应用于特定路由或请求路径的过滤器。它仅在匹配特定路由或条件时执行,适用于只对某些服务、路径或请求类型进行处理的场景。
创建局部过滤器的步骤
步骤 1:实现 GatewayFilter 接口
局部过滤器需要实现 GatewayFilter 接口。以下是一个简单的局部过滤器,它检查请求的路径并在符合条件时记录日志。
示例代码:局部过滤器
import org.springframework.stereotype.Component;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import lombok.extern.slf4j.Slf4j;@Component
@Slf4j
public class MyLocalFilter implements GatewayFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求路径String path = exchange.getRequest().getURI().getPath();log.info("Request path: " + path);// 继续执行后续过滤器return chain.filter(exchange);}
}
步骤 2:通过 RouteLocator 配置路由
在 Spring Cloud Gateway 中,您可以通过 RouteLocator 或 YAML 配置文件为特定的路由添加局部过滤器。
示例代码:配置局部过滤器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.RouteLocatorBuilder;@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("my_route", r -> r.path("/api/**") // 匹配 /api/** 路径的请求.filters(f -> f.filter(new MyLocalFilter())) // 应用 MyLocalFilter.uri("http://example.com")) // 目标服务.build();}
}
在这个例子中,我们创建了一个名为 my_route 的路由,它只对 /api/** 路径的请求应用 MyLocalFilter 过滤器。
方法二:基于 YAML 配置
如果你使用 YAML 配置文件来配置路由,也可以在 application.yml 文件中指定过滤器。
spring:cloud:gateway:routes:- id: example_routeuri: http://example.compredicates:- Path=/api/v1/**filters:- name: MyLocalFilter # 使用你定义的过滤器
为了通过 YAML 使用自定义过滤器,你需要确保在配置中通过 Spring Bean 名称引用该过滤器。若 MyLocalFilter 被 Spring 管理(通过 @Component),可以直接使用 name 来引用。
3. 自定义条件过滤器(Custom Condition Filter)
自定义条件过滤器是根据特定的条件(如请求的查询参数、请求头或路径等)来动态决定是否执行过滤器。这种过滤器提供了更高的灵活性和复杂的过滤逻辑。
创建自定义条件过滤器的步骤
步骤 1:继承 AbstractGatewayFilterFactory 创建过滤器工厂
Spring Cloud Gateway 提供了 AbstractGatewayFilterFactory 类,允许您创建自定义的过滤器工厂。您可以在工厂中设置过滤器的配置项,并根据条件来执行过滤逻辑。
示例代码:自定义条件过滤器
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.ServerHttpRequest;
import org.springframework.http.HttpStatus;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {public MyGatewayFilterFactory() {super(MyGatewayFilterFactory.Config.class); // 指定配置类}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {// 创建实际的过滤器return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();System.out.println("进入了自定义网关过滤器,status:" + config.getStatus());// 检查请求的查询参数if (request.getQueryParams().containsKey("atguigu")) {return chain.filter(exchange); // 继续请求} else {exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST); // 返回 400 错误return exchange.getResponse().setComplete(); // 完成响应}}};}// 配置快捷字段的顺序@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status"); // 配置字段名}// 配置类,保存过滤器的参数public static class Config {private String status; // 配置字段public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}}
}
步骤 2:在配置文件中应用自定义过滤器
您可以通过 YAML 或 Java 配置文件指定在哪些路由上应用此自定义条件过滤器,并传递参数。
示例代码:在 application.yml 中配置自定义过滤器
spring:cloud:gateway:routes:- id: my_routeuri: http://example.compredicates:- Path=/api/** # 匹配 /api/** 路径的请求filters:- name: MyGatewayFilterFactory # 引用自定义的过滤器args:status: "active" # 配置 status 参数
4. 过滤器类型比较
| 特性 | 全局过滤器 (Global Filter) | 局部过滤器 (Local Filter) | 自定义条件过滤器 (Custom Condition Filter) |
|---|---|---|---|
| 适用范围 | 所有请求 | 特定路由或路径的请求 | 基于特定条件,如请求参数、路径等,动态判断是否执行 |
| 使用场景 | 日志记录、全局认证、全局限流等 | 特定服务或路径的处理 | 根据条件(如请求参数、头部等)动态处理请求 |
| 配置方式 | 通过实现 GlobalFilter 接口并注册为 Spring Bean | 通过 RouteLocator 或 YAML 配置路由 | 通过 AbstractGatewayFilterFactory 创建工厂 |
5. 总结
在 Spring Cloud Gateway 中,您可以根据不同的需求创建三种类型的过滤器:
- 全局过滤器:适用于需要对所有请求进行统一处理的场
景,例如日志记录、认证和授权。
- 局部过滤器:适用于特定路由或路径的请求,能够灵活地控制不同服务的请求处理。
- 自定义条件过滤器:根据请求的特定条件(如查询参数、请求头、路径等)动态决定是否执行过滤器逻辑,提供更高的灵活性。
相关文章:
如何在 Spring Cloud Gateway 中创建全局过滤器、局部过滤器和自定义条件过滤器
Spring Cloud Gateway 是一个功能强大的 API 网关,能够处理 HTTP 请求、响应及路由。通过过滤器机制,您可以在请求和响应过程中进行各种处理操作,如记录日志、身份验证、限流等。Spring Cloud Gateway 提供了三种主要类型的过滤器:…...
PINN模型详解
定义与原理 物理信息神经网络(Physics-Informed Neural Networks, PINN)是一种创新性的机器学习模型,巧妙地将物理知识与深度学习相结合。这种独特的设计理念源于Karniadakis教授的研究团队,他们在一系列开创性工作中提出了这一概念。 PINN的核心思想是在神经网络的损失函数…...
查找路由器的管理后台ip【通用找IP】
需求: 刚刚搞了个【小米】路由器,我想进路由的管理后台,提示:安装xx的路由管家,我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继,那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…...
AI如何改变IT行业
AI如何改变IT行业 在当今数字化的社会中,人工智能(AI)不仅仅是一个技术词汇,而是一个正在重塑我们生活的现实时态。如果把AI比作一场即将到来的暴风雨,那么IT行业就是它的海洋。在这场风暴中,所有的船只都…...
运行vue项目,显示“npm”无法识别为 cmdlet、函数、脚本文件或可操作程序的名称
PS D:\weduproject\wedu1\wedu\wedu-fast-vue> npm run dev,运行时出现像下面这样的报红信息, npm : The term npm is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or …...
Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用
minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …...
OpenCV相机标定与3D重建(44)初始化广角(鱼眼)相机的投影映射函数initWideAngleProjMap()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::initWideAngleProjMap 是 OpenCV 库中的一个函数,用于初始化广角(鱼眼)相机的投影映射。这个函数生成两个…...
现代前端框架
截至2025年,现代前端框架领域仍然以React、Vue和Angular等成熟框架为主导,同时一些新兴框架也在不断崛起和发展。以下是目前较为先进和受欢迎的前端框架: 成熟框架 React 由Facebook开发,是目前最流行的前端框架之一。它使用声明…...
Vue进阶(贰幺贰)npm run build多环境编译
文章目录 一、前言二、实施三、总结:需要打包区分不同环境四、拓展阅读 一、前言 项目开发阶段,会涉及打包部署到多个环境应用场景,在不同环境中,需要进行项目层面的区分,做不同的操作,可以利用打包的--mo…...
社交新零售下开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的创新实践与发展剖析
摘要:在社交电商蓬勃发展并向社交新零售转型的浪潮中,多种创新模式与技术应用不断涌现。本文聚焦于开源 AI 智能名片 21 链动模式 S2B2C 商城小程序,深入探讨其在社交新零售格局下的内涵、优势、应用策略以及对行业发展的深远影响,…...
xml格式化(1):使用python的xml库实现自闭合标签
前言 最近一段时间一直想要写一个urdf格式化插件。 至于为什么嘛,因为使用sw2urdf插件,导出的urdf,同一标签的内容,是跨行的,这就导致,内容比较乱,而且行数比较多。影响阅读。 因此ÿ…...
重温设计模式--13、策略模式
策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来,使得算法可以独立于使用它的客户端而变化,提高了代码的灵活性和可维护性。 其主要包含以下几个…...
【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.7.1. 深入理解生命周期 1.指定生命周期参数的方式依赖于函数所做的事情 以上一篇文章的…...
产品经理-竞品分析
竞品分析是企业制定战略和产品优化的关键步骤,通过深入分析竞争对手的产品与策略,企业可以更好地定位自己并寻找改进的方向。这篇文章详细阐述了进行有效竞品分析的五个关键步骤,帮助产品经理精准掌握竞争态势,从而在市场中占据有…...
51单片机——8*8LED点阵
LED 点阵的行则为发光二极管的阳极,LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。 因此通过单片机P0口可控制点阵列,74HC595可控制点阵行 11 脚 SR…...
力扣第136题:只出现一次的数字 巧用异或
力扣第136题:只出现一次的数字 C语言解法 题目描述 给定一个非空的整数数组 nums ,其中除一个元素只出现一次外,其他每个元素均出现两次。找出那个只出现一次的元素。 示例 示例 1: 输入: nums [2,2,1] 输出: 1示例 2: 输入: nums [4…...
TCP 如何获取端口信息
注:本文为 “TCP 如何获取端口信息” 相关讨论摘录。 机翻,未校。 How TCP Gets Port Information TCP 如何获取端口信息 asked Nov 10, 2024 at 19:57 user15503745 API Call for Connection API 调用以建立连接 Before the app can send data d…...
RabbitMQ发布确认高级篇(RabbitMQ Release Confirmation Advanced Edition)
系统学习消息队列——RabbitMQ的发布确认高级篇 简介 RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),主要用于在分布式系统中进行消息传递。RabbitMQ由Erlang语言编写,具有高性能、健壮…...
福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标内容测评
【标题解析】 标题"最新福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标"揭示了几个关键信息。这是关于福建省乡镇级别的地理数据,它包含乡镇的边界信息。这些数据是以ArcGIS兼容的SHP(Shapefile)格式存储的,…...
Kafka 消费者
Kafka消费者主要负责消费(读取和处理)由生产者发布的消息。 1 消费者入门 消费组将具有相同group.id的消费者实例组织成组。它们共同读取一个或多个主题的消息。每个消费者都有一个对应的消费组。 消息发布到主题后,只会被投递给订阅它的每…...
容器编排平台服务发现与负载均衡的内部实现原理分析
容器编排平台服务发现与负载均衡的内部实现原理分析 在现代分布式系统中,容器编排平台(如Kubernetes、Docker Swarm等)已成为管理和调度容器化应用的核心工具。服务发现与负载均衡作为其关键功能,直接影响系统的可用性和性能。本…...
为什么92%的多模态API接口未启用模态级访问控制?——从Stable Diffusion API到Qwen-Audio服务的5个致命配置疏漏
第一章:多模态大模型安全与隐私保护 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在融合文本、图像、音频、视频等异构数据时,显著扩大了攻击面与隐私泄露风险。训练数据中隐含的敏感信息(如人脸、病历、地理位置)…...
yz-bijini-cosplay一文详解:Z-Image端到端Transformer架构优势解析
yz-bijini-cosplay一文详解:Z-Image端到端Transformer架构优势解析 1. 项目概述 yz-bijini-cosplay是一个专为RTX 4090显卡优化的Cosplay风格文生图解决方案。该项目基于通义千问Z-Image端到端Transformer架构,结合专属训练的LoRA权重,实现…...
同年份的 win 和 mac 硬件对比
同年份的 Windows 笔记本之所以大多“阵亡”了,而你的 MBP 2011 还能开机,根本原因不在于系统本身(Windows vs macOS),而在于两大阵营截然不同的硬件设计哲学和制造标准。 简单来说,2011年的MacBook Pro是…...
台达DVP PLC与三台变频器通讯程序详解:昆仑通态接线方式、设置指南及功能实现(频率设定、启...
台达DVP PLC与3台台达VFD-M变频器通讯程序 程序带注释,并附送昆仑通态有接线方式,设置。 器件:台达DVP ES系列的PLC,3台台达VFD M系列变频器,昆仑通态 功能:实现频率设定,启停控制,实…...
AIAgent对抗鲁棒性提升87%的关键突破:融合输入重构、特征净化与决策置信度校准的三级熔断机制
第一章:AIAgent架构中的对抗样本防御 2026奇点智能技术大会(https://ml-summit.org) 在多层协同的AIAgent系统中,对抗样本不再仅威胁单个模型组件,而是可能通过意图解析、工具调用、记忆检索等环节逐级放大偏差,最终导致决策链路…...
KV260 视觉 AI 套件实战--从零部署到网络互联(Ubuntu+SSH)
1. KV260视觉AI套件开箱初体验 第一次拿到KV260视觉AI套件时,给我的感觉就像收到了一台迷你工作站。这个巴掌大的开发板搭载了Xilinx的Zynq UltraScale MPSoC芯片,集成了四核ARM Cortex-A53处理器和可编程逻辑单元,专为边缘AI视觉应用设计。套…...
解决PyTorch与TorchVision版本冲突:从依赖管理到环境隔离的实战指南
1. 为什么PyTorch和TorchVision总是打架? 每次看到"ERROR: Cannot install torch>1.8.0 and torchvision0.9.2cu102 because these package versions have conflicting dependencies"这种报错,我都想砸键盘。这就像买了个新手机,…...
Qwen2.5与DeepSeek-7B全面对比:上下文长度与长文档处理评测
Qwen2.5与DeepSeek-7B全面对比:上下文长度与长文档处理评测 在当今大模型百花齐放的时代,7B参数级别的模型因其在性能与资源消耗间的平衡而备受关注。通义千问2.5-7B-Instruct和DeepSeek-7B作为两个备受瞩目的开源模型,都在长文本处理方面有…...
【组合实战】OCR + 图片去水印 API:自动清洗图片再识别文字(完整方案 + 代码示例)
【组合实战】OCR 图片去水印 API:自动清洗图片再识别文字(完整方案 代码示例) 在实际业务中,很多图片并不是“干净”的: 👉 带水印、遮挡、广告、LOGO、二维码…… 直接做 OCR 识别,往往会…...
