深入解析Spring Cloud Gateway的GlobalFilter
文章目录
- 摘要
- 引言
- GlobalFilter的作用
- 使用GlobalFilter
- 默认的GlobalFilter
- 自定义GlobalFilter
- 示例代码
- 配置GlobalFilter
- 配置文件方式
- 代码方式
- 高级用法:重写GlobalFilter
- 思路
- 代码实现
- 结论
- 参考文献
摘要
本文将详细介绍Spring Cloud Gateway中的GlobalFilter,解释其作用以及如何使用。通过代码示例,读者将深入了解GlobalFilter在Spring Cloud Gateway中的应用,以及如何自定义和配置GlobalFilter来实现定制化的网关逻辑。
引言
Spring Cloud Gateway是Spring Cloud生态系统中的一员,是基于Spring Framework 5、Project Reactor和Spring Boot 2构建的非阻塞网关。GlobalFilter是Spring Cloud Gateway中一个重要的组件,用于在请求经过网关时进行全局的处理操作。本文将详细介绍GlobalFilter的作用和使用方式。
GlobalFilter的作用
GlobalFilter是Spring Cloud Gateway中的全局过滤器,它能够对所有的请求进行拦截和处理。GlobalFilter通常用于实现一些全局的功能,如请求日志记录、请求鉴权、异常处理等。通过GlobalFilter,我们可以在请求经过网关之前或之后进行一系列的操作,以满足特定的需求。
使用GlobalFilter
默认的GlobalFilter
Spring Cloud Gateway默认提供了一些全局过滤器,用于实现一些常见的功能。例如,GlobalFilter接口的实现类ForwardRoutingFilter用于将请求转发到目标服务,AddResponseHeaderFilter用于添加响应头等。通过配置文件或代码的方式,我们可以使用这些默认的GlobalFilter来实现基本的网关功能。
自定义GlobalFilter
除了使用默认的GlobalFilter,我们还可以自定义GlobalFilter来实现定制化的网关逻辑。自定义GlobalFilter需要实现GlobalFilter接口,并重写filter方法。在该方法中,我们可以编写自己的逻辑来处理请求。通过使用自定义GlobalFilter,我们可以实现更加灵活和个性化的网关功能。
示例代码
下面通过示例代码,演示如何使用GlobalFilter来实现请求日志记录的功能。
@Component
public class LoggingFilter implements GlobalFilter, Ordered {private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {logger.info("Request URL: {}", exchange.getRequest().getURI());logger.info("Request Method: {}", exchange.getRequest().getMethod());logger.info("Request Headers: {}", exchange.getRequest().getHeaders());return chain.filter(exchange);}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}
在上述示例代码中,我们定义了一个名为LoggingFilter的自定义GlobalFilter。在filter方法中,我们通过ServerWebExchange对象获取请求的URL、方法和请求头,并使用日志记录下来。最后,通过调用 chain.filter(exchange) 将请求继续传递给下一个过滤器或目标服务。
为了确保自定义GlobalFilter的执行顺序,我们还需要实现Ordered接口,并重写 getOrder 方法来指定过滤器的执行顺序。在示例代码中,我们使用了 Ordered.HIGHEST_PRECEDENCE 来确保该过滤器是第一个执行的。
配置GlobalFilter
要使用自定义的GlobalFilter,我们需要将其注册到Spring Cloud Gateway中。可以通过配置文件或代码的方式进行注册。
配置文件方式
在application.yml或application.properties文件中添加以下配置:
spring:cloud:gateway:global-filters:- com.example.LoggingFilter
上述配置将LoggingFilter注册为全局过滤器。
代码方式
在Spring Boot的启动类中,使用@Bean注解将LoggingFilter注册为Bean:
@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}@Beanpublic LoggingFilter loggingFilter() {return new LoggingFilter();}
}
通过上述配置,我们将LoggingFilter注册为全局过滤器。
高级用法:重写GlobalFilter
在工作中避免不了要自定义starter,以插件的方式引入一些特殊的逻辑,但是同时还要做到用户可拓展。在starter中,可以通过实现GlobalFilter接口来编写全局过滤器。用户在引入starter后,可以通过在自己的应用中重新定义这个过滤器来覆盖starter中的默认实现。
思路
在starter中,可以通过@ConditionalOnMissingBean注解来判断当前应用中是否已经定义了该类型的bean。如果没有定义,则使用starter中的默认实现;如果有定义,则使用应用中的实现。
代码实现
-
假设我们在starter中定义了一个名为MyGlobalFilter的全局过滤器:
public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 默认实现return chain.filter(exchange);} }
-
我们可以在starter中为这个过滤器添加@ConditionalOnMissingBean注解,以确保只有在应用中没有定义该类型的bean时才会使用默认实现:
@Configuration public class MyConfiguration {@Bean@ConditionalOnMissingBeanpublic GlobalFilter myGlobalFilter() {return new MyGlobalFilter();} }
-
如果用户在自己的应用中想要覆盖这个过滤器的逻辑,只需要定义一个同名的bean即可。例如,用户可以在自己的应用中定义一个名为MyGlobalFilter的bean:
@Bean public GlobalFilter myGlobalFilter() {return (exchange, chain) -> {// 自定义实现return chain.filter(exchange);}; }
这样,在应用启动时,Spring会发现应用中已经有了一个名为MyGlobalFilter的bean,就会使用该实现代替starter中的默认实现。
总结起来,starter中的全局过滤器应该使用 @ConditionalOnMissingBean 注解,以便用户可以在自己的应用中重新定义该过滤器的实现。用户只需要定义一个同名的bean即可覆盖starter中的默认实现。
结论
在本文中,我们详细介绍了Spring Cloud Gateway中的GlobalFilter,并解释了它的作用和使用方式。通过自定义GlobalFilter,我们可以实现定制化的网关逻辑。通过配置文件或代码,我们可以注册和配置GlobalFilter来达到期望的效果。希望本文对读者在使用Spring Cloud Gateway时有所帮助,并能更好地应用于实际项目中。
参考文献
- Spring Cloud Gateway官方文档
- Spring Cloud Gateway GitHub仓库
如果大家遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言。
相关文章:

深入解析Spring Cloud Gateway的GlobalFilter
文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…...
ffmpeg的重采样计算
最近在看ffmpeg的重采样计算逻辑,有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); ,各种请教之后,记录如下。 重采样后的总样本数 为什么要涵盖重采…...
Go HTTP 调用(上)
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出&am…...

STM32Cube高效开发教程<基础篇>(一)----概述
声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 STM32系列…...
汽车RNC主动降噪算法DSP C程序实现
汽车RNC主动降噪算法C程序 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,车载...
Java21虚拟线程完整用法
方式1 Thread.startVirtualThread(new Task());方式2 Thread virtualThread Thread.ofVirtual().name("Virtual Thread").unstarted(new Task()); virtualThread.start();方式3 Thread.ofVirtual().name("Virtual Thread").start(new Task());方式4 Th…...
Vue 中的 nextTick 方法
nextTick的背景 Vue 使用虚拟 DOM(Virtual DOM)和异步更新策略来实现高效的视图更新。当你修改 Vue 实例的数据时,Vue 并不会立即更新真实的 DOM,而是将更新操作加入到队列中,在下一个事件循环周期(微任务…...

TypeScript React(上)
目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS,肯定数据符合结构 泛型、<大写字母> 扩展学习…...

Linux 安全 - LSM源码分析
文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…...

第一次汇报相关问题
深度学习现在已经学习到了Mini-Batch,early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向:云计算和嵌入式 云计算:分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…...

[产品体验] GPT4识图功能
[产品体验] GPT4识图功能 图片配文字超强的OCR能力知识问答多图解释 打开chatgpt的时候突然发现能用识图了,赶紧去体验一下,大大的震撼… 图片配文字 超强的OCR能力 我传上去的图片并不清晰… 还能准确识别,orz ! 知识问答 多…...

《3D 数学基础》几何检测-最近点
目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点,也就是q在直线上的投影。 其中p是直线上的点(向量表示),n是直线的法向量&#x…...
动态规划 -背包问题-详解
问题 注:大佬对此类问题的解法:动态规划背包问题总结 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1ÿ…...

Bootstrap-- 媒体特性
最大、最小宽度例子: 横屏与竖屏例子: 宽度比与像素比例子:...
c# 用非递归的写法实现递归
最近写代码碰到了一个bug,就是递归次数太多爆堆栈了,然后就写了一个递归工具来解决这个问题。 using System; using System.Collections.Generic;/// <summary> /// 递归工具 /// </summary> public static class RecursionTool {//递归方式…...

nginx之location的优先级和nginx的重定向
一、nginx之location的优先级和匹配方式(重点) (一)nginx的正则表达式 nginx的正则表达式 符号 含义 ^ 字符串的起始位置(以什么开头) $ 字符串的结束位置(以什么结尾) * 匹…...

【计算机网络】——前言计算机网络发展的历程概述
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法:算法专栏 C头…...
eventfd
1. #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); //创建eventfd 参数含义: initval:创建eventfd时它所对应的64位计数器的初始值; flags:eventfd文件描述符的标志,可由三种选项组…...
BES耳机空间音频技术实现
BES耳机空间音频技术实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务 音响和耳机在空间音频技术上实现方式是不同的 虚拟现实可谓是空间音频技术最具代表性的应 用领域。虽然虚拟现实的起源可以追溯到1 9 6 8年, …...

day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)
目录 Bootstrap之Modal: 显示和隐藏方法 通过自定义属性: 使用JS来控制弹框: Bootstrap之Toast: 接口文档一些用法: 删除图书: 图片上传: 图片上传步骤: 修改头像…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...