Spring Cloud Gateway快速入门(三)——过滤器

news/2024/7/24 2:53:33 标签: gateway

文章目录

  • 前言
  • Gateway内置网关过滤器
    • 什么是网关过滤器
    • Gateway内置网关过滤器
      • GlobalFilter
      • PreFilter
      • PostFilter
    • 使用示例
  • Gateway全局网关过滤器
    • 什么是全局网关过滤器
    • 使用全局网关过滤器
    • 注册全局网关过滤器
    • 使用全局网关过滤器
  • 全局网关过滤器和Gateway内置网关过滤器的区别
    • 1. 注册方式
    • 2. 执行顺序
    • 3. 自定义能力
    • 4. 灵活性和可扩展性
  • 总结

前言

Gateway过滤器是Spring Cloud Gateway提供的一种机制,用于对进入网关的请求和返回进行处理和转换。它可以用于实现各种功能,如请求鉴权、请求转发、请求限流、请求重试等。

Gateway内置网关过滤器

什么是网关过滤器

网关过滤器是Spring Cloud Gateway提供的一种机制,用于在请求进入网关和响应离开网关时进行一些预处理和后处理操作。它们可以用于实现各种功能,如请求鉴权、请求转发、请求限流等。

网关过滤器可以分为全局过滤器、前置过滤器和后置过滤器。全局过滤器会在请求进入网关时被调用,前置过滤器会在路由匹配之前被调用,后置过滤器会在路由匹配之后被调用。

Gateway内置网关过滤器

GlobalFilter

全局过滤器是在请求进入网关时被调用的过滤器。它可以用于实现一些全局的功能,如请求鉴权、请求转发等。

public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处编写全局过滤器的逻辑
        return chain.filter(exchange);
    }
}

PreFilter

前置过滤器是在路由匹配之前被调用的过滤器。它可以用于对请求进行一些预处理操作,如请求鉴权、请求转发等。

public class MyPreFilter implements GatewayFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处编写前置过滤器的逻辑
        return chain.filter(exchange);
    }
}

PostFilter

后置过滤器是在路由匹配之后被调用的过滤器。它可以用于对响应进行一些后处理操作,如响应转换、响应加密等。

public class MyPostFilter implements GatewayFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处编写后置过滤器的逻辑
        return chain.filter(exchange);
    }
}

使用示例

下面是一个使用全局过滤器、前置过滤器和后置过滤器的示例:

@Configuration
public class GatewayConfig {

    @Bean
    public MyGlobalFilter myGlobalFilter() {
        return new MyGlobalFilter();
    }

    @Bean
    public MyPreFilter myPreFilter() {
        return new MyPreFilter();
    }

    @Bean
    public MyPostFilter myPostFilter() {
        return new MyPostFilter();
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("route1", r -> r.path("/api/**")
                        .filters(f -> f.filter(myPreFilter()).filter(myPostFilter()))
                        .uri("http://example.com"))
                .build();
    }
}

在上面的示例中,我们定义了一个全局过滤器MyGlobalFilter、一个前置过滤器MyPreFilter和一个后置过滤器MyPostFilter。然后,我们使用RouteLocatorBuilder来创建一个自定义的路由定位器,并在路由定义中使用了这些过滤器。

通过以上配置,当请求的路径匹配到/api/**时,会先经过MyPreFilter进行预处理,然后经过路由转发,最后经过MyPostFilter进行后处理。

以上就是关于Gateway内置网关过滤器的介绍和使用示例。通过使用这些过滤器,我们可以方便地实现各种功能和处理逻辑,提升网关的灵活性和可扩展性。

Gateway全局网关过滤器

什么是全局网关过滤器

全局网关过滤器是Spring Cloud Gateway提供的一种机制,用于在请求进入网关时进行一些预处理操作。全局网关过滤器会在所有路由之前被调用,可以用于实现一些全局的功能,如请求鉴权、请求转发等。

使用全局网关过滤器

要使用全局网关过滤器,我们需要实现GlobalFilter接口,并重写filter()方法。在filter()方法中,我们可以编写我们的过滤器逻辑。

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处编写全局过滤器的逻辑
        return chain.filter(exchange);
    }
}

在上面的示例中,我们创建了一个名为MyGlobalFilter的全局过滤器类,并实现了GlobalFilter接口。在filter()方法中,我们可以编写我们的全局过滤器逻辑。最后,我们使用chain.filter(exchange)来继续请求的处理。

注册全局网关过滤器

要注册全局网关过滤器,我们需要将其作为一个Bean进行注册。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public MyGlobalFilter myGlobalFilter() {
        return new MyGlobalFilter();
    }
}

在上面的示例中,我们创建了一个名为GatewayConfig的配置类,并在其中将MyGlobalFilter作为一个Bean进行注册。这样,全局网关过滤器就会被自动加载到Spring Cloud Gateway中。

使用全局网关过滤器

要使用全局网关过滤器,我们只需要在过滤器中编写我们的逻辑即可。下面是一个使用全局网关过滤器的示例:

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处编写全局过滤器的逻辑
        // 检查请求头中是否包含特定的Token
        String token = exchange.getRequest().getHeaders().getFirst("Token");
        if (token == null || token.isEmpty()) {
            // 如果Token为空,则返回未授权的响应
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        // 如果Token存在,则继续处理请求
        return chain.filter(exchange);
    }
}

在上面的示例中,我们在全局网关过滤器中检查请求头中是否包含特定的Token。如果Token为空,则返回未授权的响应;如果Token存在,则继续处理请求。

通过使用全局网关过滤器,我们可以方便地实现全局的功能和处理逻辑,提升网关的灵活性和可扩展性。

以上就是关于Gateway全局网关过滤器的介绍和使用示例。通过使用全局网关过滤器,我们可以在请求进入网关时进行一些全局的预处理操作,实现各种功能和处理逻辑。

全局网关过滤器和Gateway内置网关过滤器的区别

全局网关过滤器和Gateway内置网关过滤器是Spring Cloud Gateway提供的两种不同的过滤器机制。它们之间有以下区别:

1. 注册方式

  • 全局网关过滤器:需要将其作为一个Bean进行注册,通过@Configuration注解的配置类或者通过@Bean注解的方法进行注册。
  • Gateway内置网关过滤器:内置在Spring Cloud Gateway中,无需手动注册。

2. 执行顺序

  • 全局网关过滤器:在所有路由之前被调用,可以用于实现一些全局的功能,如请求鉴权、请求转发等。
  • Gateway内置网关过滤器:根据过滤器的类型和顺序进行调用,可以在请求被路由到目标服务之前或之后进行处理。

3. 自定义能力

  • 全局网关过滤器:可以根据实际需求自定义过滤器逻辑,实现各种功能和处理逻辑。
  • Gateway内置网关过滤器:提供了一些常用的过滤器,如请求头修改、请求日志记录等,但功能相对有限。如果需要更复杂的过滤器逻辑,可能需要自定义全局过滤器。

4. 灵活性和可扩展性

  • 全局网关过滤器:由开发者自行实现,具有较高的灵活性和可扩展性,可以根据实际需求自由定制过滤器逻辑。
  • Gateway内置网关过滤器:提供了一些常用的过滤器,可以快速实现一些基本功能,但功能相对有限,无法满足所有需求。

综上所述,全局网关过滤器和Gateway内置网关过滤器都是Spring Cloud Gateway提供的过滤器机制,它们在注册方式、执行顺序、自定义能力以及灵活性和可扩展性方面存在一些区别。开发者可以根据实际需求选择合适的过滤器机制来实现网关的功能和处理逻辑。

总结

总结Gateway过滤器的关键点如下:

  1. 过滤器类型:Gateway过滤器分为全局过滤器和路由过滤器两种类型。

    • 全局过滤器:在所有路由之前被调用,用于实现一些全局的功能,如请求鉴权、请求转发等。
    • 路由过滤器:根据路由规则进行调用,可以在请求被路由到目标服务之前或之后进行处理。
  2. 过滤器执行顺序:Gateway过滤器的执行顺序由它们的优先级和添加顺序决定。

    • 全局过滤器的执行顺序由它们在应用中的注册顺序决定。
    • 路由过滤器的执行顺序由它们在路由规则中的定义顺序决定。
  3. 过滤器的注册和使用:

    • 全局过滤器:需要将其作为一个Bean进行注册,通过@Configuration注解的配置类或者通过@Bean注解的方法进行注册。
    • 路由过滤器:在路由规则中定义,并与具体的路由关联。
  4. 自定义过滤器:可以根据实际需求自定义过滤器逻辑,实现各种功能和处理逻辑。

    • 实现GatewayFilter接口来创建自定义过滤器。
    • 实现GlobalFilter接口来创建全局过滤器。
  5. 内置过滤器:Spring Cloud Gateway提供了一些常用的内置过滤器,如请求头修改、请求日志记录等。

    • 可以直接在路由规则中使用内置过滤器,也可以通过自定义过滤器链来使用。

通过使用Gateway过滤器,我们可以在请求进入网关时进行一些预处理操作,实现各种功能和处理逻辑,提升网关的灵活性和可扩展性。


http://www.niftyadmin.cn/n/5043215.html

相关文章

thinkphp8路由

thinkphp8已出来有好一段时间了。这些天闲来无事&#xff0c;研究了下tp8的路由。默认情况下&#xff0c;tp8的路由是在route\app.php的文件里。但在实际工作中&#xff0c;我们并不会这样子去写路由。因为这样不好管理。更多的&#xff0c;是通过应用级别去管理路由。假如项目…

VuePress网站如何使用axios请求第三方接口

前言 VuePress是一个纯静态网站生成器,也就是它是无后端,纯前端的,那想要在VuePress中,发送ajax请求,请求一些第三方接口,有时想要达到自己一些目的 在VuePress中&#xff0c;使用axios请求第三方接口&#xff0c;需要先安装axios&#xff0c;然后引入&#xff0c;最后使用 本文…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑&#xff0c;我们需要修改一下样式&#xff0c;下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

SQLite 3.43 发布,性能大提升!

前言 SQLite是一种被广泛运用的嵌入式关系型数据库管理系统&#xff0c;最新发布的SQLite 3.43版本带来了一个重要的改进&#xff0c;大幅提升了对JSON数据的处理性能&#xff0c;达到了之前的两倍。 主要更新 添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索…

stm32之GPIO库函数点灯分析

stm32官方为了方便开发者&#xff0c;利用CubeMX 生成HAL库有关的C代码。HAL库就是硬件抽象层(hardware abstraction layer)&#xff0c;生成一系列的函数帮助我们快速生成工程&#xff0c;脱离复杂的寄存器配置。stm32相对于51来功能强大&#xff0c;但是寄存器的数量也不是一…

Direct3D模板缓存

模板缓存是一个用于获得某种特效的离屏缓存&#xff0c;模板缓存的分辨率与后台缓存和深度缓存的分辨率完全相同&#xff0c;所以像素也是一一对应的&#xff0c;模板缓存允许我们动态的&#xff0c;有针对性的决定是否将某个像素写入后台缓存中。 例如实现镜面效果时&#xf…

科普之加密、签名和SSL握手

一 背景知识 感悟&#xff1a; 不能高不成低不就备注&#xff1a; 以下内容没有逻辑排版,仅做记录 ① 加密方式 说明&#xff1a; 单向和双向认证遗留&#xff1a; 如何用openssl从私钥中提取公钥? ② 互联网数据安全可靠条件 说明&#xff1a; 二者相互印证 二 互联…

02-数据结构-线性表

线性表的特点&#xff1a; (1)存在惟一一个被称为"第一个"的数据元素 (2)存在惟一一个被称为"最后一个"的数据元素 (3)除第一个之外&#xff0c;集合中每一个数据元素均只有一个前驱 (4)除最后一个之外&#xff0c;集合中每个数据均只有一个后继 线性表是…