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


    前言

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    PreFilter

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

    public class MyPreFilter implements GatewayFilter {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            // 在此处编写前置过滤器的逻辑
            return chain.filter(exchange);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    PostFilter

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

    public class MyPostFilter implements GatewayFilter {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            // 在此处编写后置过滤器的逻辑
            return chain.filter(exchange);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用示例

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

    @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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在上面的示例中,我们定义了一个全局过滤器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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上面的示例中,我们创建了一个名为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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在上面的示例中,我们创建了一个名为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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在上面的示例中,我们在全局网关过滤器中检查请求头中是否包含特定的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过滤器,我们可以在请求进入网关时进行一些预处理操作,实现各种功能和处理逻辑,提升网关的灵活性和可扩展性。

  • 相关阅读:
    模拟客户在银行存取款
    PHP 5 echo 和 print 语句
    工作小计 zookpeer3.8 C api环境搭建
    glibc源码阅读
    细胞膜包裹氧化物纳米复合物/金纳米粒子/笼/仿生细胞膜-内核纳米粒子的制备
    第02章 前馈神经网络
    flink 网络中断错误信息跟踪
    华为---PPP协议简介及示例配置
    DOM 事件模型和事件委托
    【JavaScript-26】js的内置对象Math,随机数获取随机颜色
  • 原文地址:https://blog.csdn.net/yangsimo/article/details/133176110