网关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);
    }


    @Override
    public 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的数据流  创建一个任务
             */
            @Override
            public 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类型过滤器的逻辑
                }));
            }
        };
    }

    //设置优先级
    @Override
    public 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
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("Pre Global Filter");
        return chain.filter(exchange).then(Mono.fromRunnable(()->{
            log.info("Post Global Filter");
        }));
    }

    @Override
    public 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中扩展和定制过滤器,以满足不同场景下的需求。自定义过滤器能够帮助开发者实现更加灵活和精细的请求处理逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】2、大语言模型综述

一、背景和发展历程 大语言模型四个训练阶段&#xff1a; 预训练&#xff1a; 利用海量的训练数据&#xff0c;包括互联网网页、维基百科、书籍、GitHub、 论文、问答网站等&#xff0c;构建包含数千亿甚至数万亿单词的具有多样性的内容。利用由数千块高性能 GPU 和高速网络组成…

C语言指针介绍其一

指针是什么&#xff1f; 指针是内存中一个最小单元&#xff08;一个字节&#xff09;的编号&#xff0c;也就是地址&#xff0c;每一个单元都有属于自己的地址。 平时我们说的指针一般说的是指针变量&#xff0c;用来存放内存地址的变量就叫指针变量。 指针变量 int main()…

Postgresql中json和jsonb类型区别

在我们的业务开发中&#xff0c;可能会因为特殊【历史&#xff0c;偷懒&#xff0c;防止表连接】经常会有JSON或者JSONArray类的数据存储到某列中&#xff0c;这个时候再PG数据库中有两种数据格式可以直接一对多或者一对一的映射对象。所以我们也可能会经常用到这类格式数据&am…

Vivado 设置关联使用第三方仿真软件 Modelsim

目录 1.前言2.Vivado 设置关联使用第三方仿真软件 Modelsim 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 Vivado 软件自带有仿真功能,该功能使用还是比较方便的,初学者可以直接使用自带的仿真功能。 Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他…

服务器遭遇UDP攻击时的应对与解决方案

UDP攻击作为分布式拒绝服务(DDoS)攻击的一种常见形式&#xff0c;通过发送大量的UDP数据包淹没目标服务器&#xff0c;导致网络拥塞、服务中断。本文旨在提供一套实用的策略与技术手段&#xff0c;帮助您识别、缓解乃至防御UDP攻击&#xff0c;确保服务器稳定运行。我们将探讨监…

【重学C语言】十八、SDL2 图形编程介绍和环境配置

【重学C语言】十八、SDL2 图形编程介绍和环境配置 **SDL2介绍**SDL 2用途SDL 在哪些平台上运行&#xff1f;下载和安装 SDL2安装 SDL2 clion 配置 SDL2 SDL2介绍 SDL2&#xff08;Simple DirectMedia Layer 2&#xff09;是一个开源的跨平台多媒体开发库&#xff0c;主要用于游…

项目:基于httplib/消息队列负载均衡式在线OJ

文章目录 写在前面关于组件开源仓库和项目上线其他文档说明项目亮点 使用技术和环境项目宏观结构模块实现compiler模块runner模块compile_run模块compile_server模块 基于MVC结构的OJ服务什么是MVC&#xff1f;用户请求服务路由功能Model模块view模块Control模块 写在前面 关于…

Windows11下Docker使用记录(五)

目录 准备1. WSL安装cuda container toolkit2. win11 Docker Desktop 设置3. WSL创建docker container并连接cuda4. container安装miniconda&#xff08;可选&#xff09; Docker容器可以从底层虚拟化&#xff0c;使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…

激活函数对比

激活函数 sigmoid / tanh / relu / leaky relu / elu / gelu / swish 1、sigmoid 优缺点 1) 均值!0&#xff0c;导致fwxb求导时&#xff0c;方向要么全正要么全负 可以通过batch批量训练来缓解 2) 输入值大于一定范围梯度就会消失 3) 运算复杂 2、tanh 优缺点 1) 均值0 2)…

Ubuntu部署开源网关Apache APISIX

说明 系统&#xff1a;Ubuntu 24.04 LTSDocker版本&#xff1a;v26.1.3Docker Compose版本&#xff1a;v2.26.1 下载和配置 Ubuntu需要安装Docker和Docker Compose 下载apisix-docker仓库 git clone https://github.com/apache/apisix-docker.git修改docker-compose 配置e…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

【2024】零基础Python 快速入门篇

2023年是AI的元年&#xff0c;AI的爆火不仅推动了科技领域的进步&#xff0c;更让 Python 语言成为了这一变革中的关键角色。 Python 语言简单易懂&#xff0c;语法清晰明了&#xff0c;懂一点英语的都能学得会。很适合在职场摸爬滚打多年的前端组长作为捅破天花板的语言&…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

贪心算法学习一

例题一 解法&#xff08;贪⼼&#xff09;&#xff1a; 贪⼼策略&#xff1a; 分情况讨论&#xff1a; a. 遇到 5 元钱&#xff0c;直接收下&#xff1b; b. 遇到 10 元钱&#xff0c;找零 5 元钱之后&#xff0c;收下&#xff1b; c. 遇到 20 元钱&#xff1a…

JWT及单点登录实现

JWT发展简史 JWT Token JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。 ID Token OIDC (OpenID Connect) 协议 (opens new window)对 OAuth 2.0 协议 …

【SpringBoot + Vue 尚庭公寓实战】项目初始化准备(二)

尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09; 文章目录 尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09;1、导入数据库2、创建工程3、项目初始配置3.1、SpringBoot依赖配置3.2、创建application.yml文件3.3、创建…

【Mac】Alfred 5 for Mac(苹果效率提升工具)v5.5软件介绍及安装教程

软件介绍 Alfred 是适用于 Mac 操作系统的流行生产力应用程序。它旨在帮助用户在 Mac 电脑上更高效地启动应用程序、搜索文件和文件夹以及执行各种任务。借助 Alfred&#xff0c;用户可以创建自定义键盘快捷方式、设置自定义工作流程并使用热键访问功能。 Alfred for Mac 的一…

离散数学期末复习题库(含答案)

目录 1.判断题 1-1 1-2 1-3 1-4 2.选择题 2-1 2-2 2-3 3.多选题 3-1 4.填空题 4-1 4-2 4-3 4-4 4-5 5.主观题 5-1 5-2 5-3 5-4 1.判断题 1-1 ϕ⊆{ϕ} &#xff08;对&#xff09; 1-2 {a,b}∈{a,b,c,{a,b}} &#xff08;对&#xff09; 1-3 {a,b…

【西瓜书】2.模型评估与选择

1.经验误差与过拟合 &#xff08;1&#xff09;错误率、精度 &#xff08;2&#xff09;误差&#xff1a;训练误差/经验误差、泛化误差 &#xff08;3&#xff09;过拟合、欠拟合 欠拟合好克服&#xff0c;过拟合无法彻底避免 2.三大任务——评估方法 泛化误差的评估方法&a…

14本剔除!Scopus目录第四次更新,Hindawi期刊再次上榜

【SciencePub学术】近期&#xff0c;Scopus数据库迎来本年度第四次更新&#xff01;此次更新后&#xff0c;有89本期刊发生变动&#xff1a; 变动详情 •【新增】75本新增期刊进入Scopus数据库 •【剔除】14本期刊被Scopus数据库剔除 目前Scopus 来源出版物列表&#xff08;…