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

深入解析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中的默认实现;如果有定义,则使用应用中的实现。

代码实现

  1. 假设我们在starter中定义了一个名为MyGlobalFilter的全局过滤器:

    public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 默认实现return chain.filter(exchange);}
    }
    
  2. 我们可以在starter中为这个过滤器添加@ConditionalOnMissingBean注解,以确保只有在应用中没有定义该类型的bean时才会使用默认实现:

    @Configuration
    public class MyConfiguration {@Bean@ConditionalOnMissingBeanpublic GlobalFilter myGlobalFilter() {return new MyGlobalFilter();}
    }
    
  3. 如果用户在自己的应用中想要覆盖这个过滤器的逻辑,只需要定义一个同名的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配置文件方式代码方式 高级用法&#xff1a;重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…...

ffmpeg的重采样计算

最近在看ffmpeg的重采样计算逻辑&#xff0c;有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); &#xff0c;各种请教之后&#xff0c;记录如下。 重采样后的总样本数 为什么要涵盖重采…...

Go HTTP 调用(上)

哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的内容是 Go HTTP 调用。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&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&#xff08;Virtual DOM&#xff09;和异步更新策略来实现高效的视图更新。当你修改 Vue 实例的数据时&#xff0c;Vue 并不会立即更新真实的 DOM&#xff0c;而是将更新操作加入到队列中&#xff0c;在下一个事件循环周期&#xff08;微任务…...

TypeScript React(上)

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

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&#xff0c;early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向&#xff1a;云计算和嵌入式 云计算&#xff1a;分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…...

[产品体验] GPT4识图功能

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

《3D 数学基础》几何检测-最近点

目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点&#xff0c;也就是q在直线上的投影。 其中p是直线上的点&#xff08;向量表示&#xff09;&#xff0c;n是直线的法向量&#x…...

动态规划 -背包问题-详解

问题 注&#xff1a;大佬对此类问题的解法&#xff1a;动态规划背包问题总结 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff…...

Bootstrap-- 媒体特性

最大、最小宽度例子&#xff1a; 横屏与竖屏例子&#xff1a; 宽度比与像素比例子&#xff1a;...

c# 用非递归的写法实现递归

最近写代码碰到了一个bug&#xff0c;就是递归次数太多爆堆栈了&#xff0c;然后就写了一个递归工具来解决这个问题。 using System; using System.Collections.Generic;/// <summary> /// 递归工具 /// </summary> public static class RecursionTool {//递归方式…...

nginx之location的优先级和nginx的重定向

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

【计算机网络】——前言计算机网络发展的历程概述

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法&#xff1a;算法专栏 C头…...

eventfd

1. #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); //创建eventfd 参数含义&#xff1a; initval&#xff1a;创建eventfd时它所对应的64位计数器的初始值&#xff1b; flags&#xff1a;eventfd文件描述符的标志&#xff0c;可由三种选项组…...

BES耳机空间音频技术实现

BES耳机空间音频技术实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务 音响和耳机在空间音频技术上实现方式是不同的 虚拟现实可谓是空间音频技术最具代表性的应 用领域。虽然虚拟现实的起源可以追溯到1 9 6 8年, …...

day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)

目录 Bootstrap之Modal&#xff1a; 显示和隐藏方法 通过自定义属性&#xff1a; 使用JS来控制弹框&#xff1a; Bootstrap之Toast&#xff1a; 接口文档一些用法&#xff1a; 删除图书&#xff1a; 图片上传&#xff1a; 图片上传步骤&#xff1a; 修改头像&#xf…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

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

MySQL 知识小结(一)

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