当前位置: 首页 > 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;只会被投递给订阅它的每…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...