当前位置: 首页 > news >正文

如何在 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 网关&#xff0c;能够处理 HTTP 请求、响应及路由。通过过滤器机制&#xff0c;您可以在请求和响应过程中进行各种处理操作&#xff0c;如记录日志、身份验证、限流等。Spring Cloud Gateway 提供了三种主要类型的过滤器&#xff1a…...

PINN模型详解

定义与原理 物理信息神经网络(Physics-Informed Neural Networks, PINN)是一种创新性的机器学习模型,巧妙地将物理知识与深度学习相结合。这种独特的设计理念源于Karniadakis教授的研究团队,他们在一系列开创性工作中提出了这一概念。 PINN的核心思想是在神经网络的损失函数…...

查找路由器的管理后台ip【通用找IP】

需求&#xff1a; 刚刚搞了个【小米】路由器&#xff0c;我想进路由的管理后台&#xff0c;提示&#xff1a;安装xx的路由管家&#xff0c;我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继&#xff0c;那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…...

AI如何改变IT行业

AI如何改变IT行业 在当今数字化的社会中&#xff0c;人工智能&#xff08;AI&#xff09;不仅仅是一个技术词汇&#xff0c;而是一个正在重塑我们生活的现实时态。如果把AI比作一场即将到来的暴风雨&#xff0c;那么IT行业就是它的海洋。在这场风暴中&#xff0c;所有的船只都…...

运行vue项目,显示“npm”无法识别为 cmdlet、函数、脚本文件或可操作程序的名称

PS D:\weduproject\wedu1\wedu\wedu-fast-vue> npm run dev&#xff0c;运行时出现像下面这样的报红信息&#xff0c; 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 如上所示&#xff0c;在Linux中启动minikube运行环境 service docker start docker version service docker …...

OpenCV相机标定与3D重建(44)初始化广角(鱼眼)相机的投影映射函数initWideAngleProjMap()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::initWideAngleProjMap 是 OpenCV 库中的一个函数&#xff0c;用于初始化广角&#xff08;鱼眼&#xff09;相机的投影映射。这个函数生成两个…...

现代前端框架

截至2025年&#xff0c;现代前端框架领域仍然以React、Vue和Angular等成熟框架为主导&#xff0c;同时一些新兴框架也在不断崛起和发展。以下是目前较为先进和受欢迎的前端框架&#xff1a; 成熟框架 React 由Facebook开发&#xff0c;是目前最流行的前端框架之一。它使用声明…...

Vue进阶(贰幺贰)npm run build多环境编译

文章目录 一、前言二、实施三、总结&#xff1a;需要打包区分不同环境四、拓展阅读 一、前言 项目开发阶段&#xff0c;会涉及打包部署到多个环境应用场景&#xff0c;在不同环境中&#xff0c;需要进行项目层面的区分&#xff0c;做不同的操作&#xff0c;可以利用打包的--mo…...

社交新零售下开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的创新实践与发展剖析

摘要&#xff1a;在社交电商蓬勃发展并向社交新零售转型的浪潮中&#xff0c;多种创新模式与技术应用不断涌现。本文聚焦于开源 AI 智能名片 21 链动模式 S2B2C 商城小程序&#xff0c;深入探讨其在社交新零售格局下的内涵、优势、应用策略以及对行业发展的深远影响&#xff0c…...

xml格式化(1):使用python的xml库实现自闭合标签

前言 最近一段时间一直想要写一个urdf格式化插件。 至于为什么嘛&#xff0c;因为使用sw2urdf插件&#xff0c;导出的urdf&#xff0c;同一标签的内容&#xff0c;是跨行的&#xff0c;这就导致&#xff0c;内容比较乱&#xff0c;而且行数比较多。影响阅读。 因此&#xff…...

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…...

【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.7.1. 深入理解生命周期 1.指定生命周期参数的方式依赖于函数所做的事情 以上一篇文章的…...

产品经理-竞品分析

竞品分析是企业制定战略和产品优化的关键步骤&#xff0c;通过深入分析竞争对手的产品与策略&#xff0c;企业可以更好地定位自己并寻找改进的方向。这篇文章详细阐述了进行有效竞品分析的五个关键步骤&#xff0c;帮助产品经理精准掌握竞争态势&#xff0c;从而在市场中占据有…...

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…...

力扣第136题:只出现一次的数字 巧用异或

力扣第136题&#xff1a;只出现一次的数字 C语言解法 题目描述 给定一个非空的整数数组 nums &#xff0c;其中除一个元素只出现一次外&#xff0c;其他每个元素均出现两次。找出那个只出现一次的元素。 示例 示例 1: 输入: nums [2,2,1] 输出: 1示例 2: 输入: nums [4…...

TCP 如何获取端口信息

注&#xff1a;本文为 “TCP 如何获取端口信息” 相关讨论摘录。 机翻&#xff0c;未校。 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是一个开源的消息代理软件&#xff0c;实现了‌高级消息队列协议&#xff08;AMQP&#xff09;‌&#xff0c;主要用于在分布式系统中进行消息传递。RabbitMQ由‌‌Erlang语言编写&#xff0c;具有高性能、健壮…...

福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标内容测评

【标题解析】 标题"最新福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标"揭示了几个关键信息。这是关于福建省乡镇级别的地理数据&#xff0c;它包含乡镇的边界信息。这些数据是以ArcGIS兼容的SHP&#xff08;Shapefile&#xff09;格式存储的&#xff0c;…...

Kafka 消费者

Kafka消费者主要负责消费&#xff08;读取和处理&#xff09;由生产者发布的消息。 1 消费者入门 消费组将具有相同group.id的消费者实例组织成组。它们共同读取一个或多个主题的消息。每个消费者都有一个对应的消费组。 消息发布到主题后&#xff0c;只会被投递给订阅它的每…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...