当前位置: 首页> 教育> 就业 > 网关API(SpringCloudGateway)如何自定义Filter

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

时间:2025/7/12 20:09:15来源:https://blog.csdn.net/m0_74749208/article/details/139507574 浏览次数:0次

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: