Spring Cloud Gateway 的过滤器:自己编写过滤器用GatewayFilterFactory?AbstractGatewayFilterFactory?

这两个类虽然都是 Spring Cloud Gateway 的过滤器,但它们有不同的设计目的和实现方式:

  1. FilterA (直接实现 GatewayFilterFactory)

    • 这是直接实现基础接口的方式

    • 需要自己处理所有过滤逻辑

    • 通常需要实现 apply() 方法来创建过滤器

    • 配置处理需要自己实现

  2. TokenValidateGatewayFilterFactory (继承 AbstractGatewayFilterFactory)

    • 这是更高级的抽象实现方式

    • 继承了模板方法和配置处理等基础功能

    • 只需要实现 apply() 或特定方法即可

    • 内置了配置类的支持(通过泛型 Config 指定)

    • 提供了更结构化的方式来创建过滤器

主要区别:

  • 抽象级别:抽象基类提供了更多开箱即用的功能

  • 配置处理:继承方式自动支持配置绑定

  • 便利性:抽象基类减少了样板代码

  • 推荐做法:Spring官方推荐继承 AbstractGatewayFilterFactory

典型实现对比:

@Data
public class Config {

    /**
     * 黑名单前置路径
     */
    private List<String> blackPathPre;
}

假设我们需要一个给请求添加 X-Custom-Header 的过滤器,对比两种实现:

方式1:直接实现 GatewayFilterFactory(手动挡)
public class AddHeaderFilter implements GatewayFilterFactory {
    @Override
    public GatewayFilter apply(Object config) {
        // 需要自己处理所有事情:
        // 1. 手动解析配置(如果要用配置)
        // 2. 完全自己写过滤逻辑
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest()
                .mutate()
                .header("X-Custom-Header", "手动实现的过滤器")
                .build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
}

 痛点
❌ 如果要支持配置(比如从配置文件读取header名和值),需要自己写解析逻辑
❌ 重复的样板代码多(比如异常处理、配置校验)

方式2:继承 AbstractGatewayFilterFactory(自动挡)
public class AddHeaderFilterFactory extends AbstractGatewayFilterFactory<AddHeaderFilterFactory.Config> {
    
    // 自动绑定配置类(YAML中的配置会映射到这里)
    @Data
    public static class Config {
        private String name;  // 对应配置中的 header-name
        private String value; // 对应配置中的 header-value
    }

    @Override
    public GatewayFilter apply(Config config) {
        // 只需关注核心逻辑,配置已自动注入
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest()
                .mutate()
                .header(config.getName(), config.getValue())
                .build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
}

 使用时可以在 application.yml 配置

spring:
  cloud:
    gateway:
      routes:
        - id: test
          uri: http://example.com
          filters:
            - name: AddHeaderFilterFactory
              args:
                name: X-Custom-Header  # 自动绑定到Config.name
                value: 来自配置的值     # 自动绑定到Config.value

tip:在一个项目中可以同时使用这两种过滤器,并且它们都可以用 @Order 注解来控制执行顺序。

优势
✅ 自动处理配置绑定(不用手动解析YAML/Properties)
✅ 内置健壮性检查(如配置缺失会提前报错)
✅ 代码更专注业务逻辑

 最终结论

  1. 功能上没区别:两种方式最终都能实现相同的过滤效果。

  2. 开发效率区别大

    • 如果你只是写一个固定逻辑的过滤器(比如强制校验Token),直接实现更简单。

    • 如果你需要从配置文件动态控制过滤器行为(比如可配置的黑名单),继承抽象类能省30%代码量。

  3. @Order 通用:无论哪种方式,Spring都一视同仁地处理执行顺序。

建议:新手先用 AbstractGatewayFilterFactory,等熟悉了再尝试直接实现。

路由级过滤器 (GatewayFilterFactory 实现)

  • ✅ 必须匹配路由规则才会触发

    • 只有请求命中了 application.yml 或 Java DSL 中配置的特定路由,该路由下的过滤器才会执行

  • 拦截逻辑
    请求 → 先匹配路由 → 命中后执行该路由的过滤器 → 转发到目标服务

全局过滤器 (GlobalFilter 实现)

  • ❌ 不需要匹配路由规则

    • 只要请求到达网关,所有 GlobalFilter 都会执行(无论是否命中路由)

    • 拦截逻辑
      请求 → 执行所有 GlobalFilter → 匹配路由 → 执行路由过滤器 → 转发到目标服务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值