网关API(SpringCloudGateway)如何自定义Filter

1.前言

        SpringCloud 虽然给我们提供了很多过滤器,但是这些过滤器功能都是固定的,无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。

        开发者可以根据自己的业务需求自定义过滤器。

2. 自定义 GatewayFilter(局部过滤器)

  • GatewayFilter 则是局部过滤器,它们可以应用到特定的路由或者路径上。通过将过滤器应用到特定的路由配置中,可以使得这些过滤器只在特定的请求路径下生效。 

通常情况下,GatewayFilter 可以分为两类:

  1. Pre 过滤器:在请求被路由到目标服务之前执行。例如,可以在此类过滤器中进行身份验证、日志记录、请求修改等操作。

  2. Post 过滤器:在请求被路由到目标服务之后执行。通常用于记录响应日志、修改响应、添加响应头等操作。

Spring Cloud Gateway 中的过滤器可以按照顺序链式执行,从而实现复杂的请求处理逻辑。通过自定义和组合不同的过滤器,可以满足各种场景下的需求。

        2.1 代码实现 

1. 编写一个类,继承的抽象类是 AbstractGatewayFilterFactory创建自定义的局部网关过滤器,用于接收过滤器的配置参数。

实现 Ordered 用于自定义过滤器的执行顺序。

/*** @Description: 自定义Gateway过滤器* @Author: windStop* @Date: 2024/6/6 9:58*/
@Component
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {//表示过滤器要接收到一个什么类型的参数才能正常运行public CustomGatewayFilterFactory() {super(CustomConfig.class);}@Overridepublic GatewayFilter apply(CustomConfig config) {return new GatewayFilter() {/**** @param exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问*                通俗的讲,就是封装了request和response* @param chain   过滤器链* Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知* @return   chain.filter(exchange) 执行请求*          Mono.fromRunnable(): 创建一个包含Runnable的数据流  创建一个任务*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//Pre 类型执行请求   post类型 执行log.info("pre Filter:{},",config);//Pre过滤器 的逻辑return chain.filter(exchange).then(Mono.fromRunnable(()->{log.info("Post Filter....");//Post类型过滤器的逻辑}));}};}//设置优先级@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}

        2.2 代码介绍

  1. public CustomGatewayFilterFactory() {super(CustomConfig.class);}: 这是 CustomGatewayFilterFactory 的构造函数,其中调用了父类 AbstractGatewayFilterFactory 的构造函数,指定了过滤器接收的配置参数类型为 CustomConfig.class

  2. @Override public GatewayFilter apply(CustomConfig config) {...}: 这是 AbstractGatewayFilterFactory 类中的抽象方法,用于创建并返回一个自定义的网关过滤器。在这里,根据传入的配置参数 config,创建了一个 GatewayFilter 实例,并在 filter 方法中编写了过滤器的逻辑。
    其中的参数介绍:

    exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问通俗的讲,就是封装了request和response@param chain   过滤器链Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知@return   chain.filter(exchange) 执行请求Mono.fromRunnable(): 创建一个包含Runnable的数据流  创建一个任务,线程的方式。
    
  3. @Override public int getOrder() {return Ordered.LOWEST_PRECEDENCE;}: 这是实现了 Ordered 接口中的 getOrder 方法,用于设置过滤器的执行顺序。在这里,返回了一个常量 Ordered.LOWEST_PRECEDENCE,表示该过滤器的执行优先级最低,会在所有其他过滤器之后执行。

总的来说,这段代码定义了一个自定义的 Gateway 过滤器工厂,用于创建自定义的网关过滤器,并且指定了过滤器的配置参数类型、过滤器的执行逻辑以及执行顺序。

        2.3 配置文件

 这里声明过滤器的name要和GatewayFilterFactory的前缀一样才可以自动映射,args为需要将参数进行传递。

3. 自定义 GlobalFilter(全局过滤器)

        3.1 代码实现

/*** @Description: 全局过滤器* @Author: windStop* @Date: 2024/6/6 18:23*/
@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {/*** 实现全局的过滤器* @param exchange  封装了request和response方法* @param chain 过滤器链* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("Pre Global Filter");return chain.filter(exchange).then(Mono.fromRunnable(()->{log.info("Post Global Filter");}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}

因为和上述相似就不介绍了

        3.2 配置文件

不需要任何配置文件,因为他是对我们所有的路由都进行生效的。 

4. 总结 

这份文档主要介绍了在Spring Cloud Gateway中如何自定义局部过滤器(GatewayFilter)和全局过滤器(GlobalFilter),以及它们的实现步骤和配置方式。

  1. 局部过滤器(GatewayFilter)

    • 通过继承AbstractGatewayFilterFactory类创建自定义过滤器工厂,实现apply()方法来定义过滤器的逻辑。
    • 过滤器逻辑中,可以对请求进行预处理(Pre类型)或者后处理(Post类型)。
    • 使用Mono<Void>作为返回类型,表示过滤器的异步执行结果。
    • 通过实现Ordered接口来设置过滤器的执行顺序。
  2. 全局过滤器(GlobalFilter)

    • 实现GlobalFilter接口来定义全局过滤器,它会对所有的路由都生效。
    • 同样使用Mono<Void>作为返回类型,并在逻辑中调用chain.filter(exchange)来执行后续过滤器和路由处理。
  3. 配置文件

    • 对于局部过滤器,需要在配置文件中声明过滤器的名称和参数。
    • 对于全局过滤器,则不需要任何配置文件,因为它会对所有路由生效。

总的来说,这份文档清晰地展示了如何在Spring Cloud Gateway中扩展和定制过滤器,以满足不同场景下的需求。自定义过滤器能够帮助开发者实现更加灵活和精细的请求处理逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…

【Python】解决Python报错:KeyError: ‘username‘

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 用户输入处理错误2.2 动态数据源 3. 解决方案3.1 使用 get() 方法3.2 检查键是否存在 4. 预防措施4.1 数据验证4.2 使用默认字典 (defaultdict) 结语 引言 在Python开发中&#xff0c;处理字典时遇到 KeyError 是一种…

Elastic 8.14:用于简化分析的 Elasticsearch 查询语言 (ES|QL) 正式发布

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.14 正式发布。 什么是新的&#xff1f; 8.14 版本最重要的标题是 ES|QL 的正式发布(GA)&#xff0c;它是从头开始设计和专门构建的&#xff0c;可大大简化数据调查。在新的查询引擎的…

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…

HC-SR505人体感应灯

1硬件 1.1硬件组成 1.正点原子探索者开发板 2 HC-SR505迷你小型人体感应模块 3 继电器&#xff0b;5V小灯 HC-SR505迷你小型人体感应模块介绍 1.2 硬件连接 1.HC-SR505&#xff08;连接在PE0&#xff09; 2.继电器&#xff08;连接在PE1&#xff09; 2.主要代码 int ma…

【nerf】nvidia-smi

当cmd下nvidia -smi不能使用时候 沿着以下路径打开cmd&#xff0c;再输入&#xff0c;可以查看cuda版本 然后查看电脑安装的

【QT5】<总览五> QT多线程、TCP/UDP

文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】&#xff1c;总览四&#xff1e; QT常见绘图、图表及动画。若存在…

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇&#xff1a;数据结构-二叉树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &…

Llama模型家族之Stanford NLP ReFT源代码探索 (四)Pyvene论文学习

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…

Java数据结构准备工作---常用类

文章目录 前言1.包装类1.1.包装类基本知识1.2.包装类的用途1.3.装箱和拆箱1.3.1.装箱&#xff1a;1.3.2.拆箱 1.4 包装类的缓存问题 2.时间处理类2.1.Date 时间类(java.util.Date)2.2.DateFormat 类和 SimpleDateFormat 类2.3.Calendar 日历类 3.其他常用类3.1.Math类3.2.Rando…

Diffusers代码学习: T2I Adapter

T2I Adapter是一款轻量级适配器&#xff0c;用于控制文本到图像模型并为其提供更准确的结构指导。它通过学习文本到图像模型的内部知识与外部控制信号&#xff08;如边缘检测或深度估计&#xff09;之间的对齐来工作。 T2I Adapter的设计很简单&#xff0c;条件被传递到四个特征…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

KEIL5如何打开KEIL4的GD工程

GD官方提供的很多KEIL例程为KIEL4的版本&#xff0c;读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题&#xff0c;具体表现如下图所示。 我们该怎么办呢&#xff1f; 下面为大家介绍两种方法&#xff1a; 第一种方法是在keil4的工程后缀u…

基于不确定性的相互学习 用于联合医学图像分类和分割

文章目录 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation摘要方法实验结果 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation 摘要 该论文提出了一种基于不确定性的相互学习…

eNSP学习——RIP故障处理

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、导入设备预配置 2、排除R1与R2间的故障 3、排除R1与R3间的故障 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp配置命令大全资源-CSDN文库 主要命令 //检查…

SpringBoot集成缓存功能

1. 缓存规范 Java Caching定义了五个核心接口&#xff0c;分别是&#xff1a;CachingProvider、CacheManager、Cache、Entry和Expiry。 CachingProvider&#xff1a;定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。CacheM…

分治乘法详细讲解

我绝对不会告诉你我是因为太蒻了&#xff0c;不会 FFT 才搞这个的。 我用一下别人的图没什么问题吧 看得懂吧&#xff1f;比如 X 123456 , Y 987654 X123456,Y987654 X123456,Y987654&#xff0c;则 n 3 , A 123 , B 456 , C 987 , D 654 n3,A123,B456,C987,D654 n3…

Web学习_SQL注入_联合查询注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c; UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名&#xff0c;并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符&#xff0c;将攻击者希望查询的语句…