SpringCloud网关GateWay过滤器

过滤器类型
Spring Cloud Gateway 的 Filter 从作用范围可分为另外两种GatewayFilter 与 GlobalFilter。
GatewayFilter :应用到单个路由或者一个分组的路由上。
GlobalFilter :应用到所有的路由上。(优先级比上面一个高)

局部过滤器
局部过滤器(GatewayFilter),是针对单个路由的过滤器。可以对访问的URL过滤,进行切面处理。在
Spring Cloud Gateway中通过GatewayFilter的形式内置了很多不同类型的局部过滤器。这里简单将
Spring Cloud Gateway内置的所有过滤器工厂整理成了一张表格,虽然不是很详细,但能作为速览使
用。如下:
在这里插入图片描述
在这里插入图片描述
每个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 结尾,这是
Spring Cloud Gateway的一个约定,例如 AddRequestHeader 对应的实现类为
AddRequestHeaderGatewayFilterFactory 。对于这些过滤器的使用方式可以参考官方文档

全局过滤器
全局过滤器(GlobalFilter)作用于所有路由,Spring Cloud Gateway 定义了Global Filter接口,用户
可以自定义实现自己的Global Filter。通过全局过滤器可以实现对权限的统一校验,安全性验证等功
能,并且全局过滤器也是程序员使用比较多的过滤器。
Spring Cloud Gateway内部也是通过一系列的内置全局过滤器对整个路由转发进行处理如下:
在这里插入图片描述
局部过滤器

public class MyGatewayFilter implements GatewayFilter , Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("自定义网关过滤器被执行。。。");
        return chain.filter(exchange);
    }

    /**
     * 数值越小优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
@Configuration
public class GatewayRoutesConfig {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder){
        return builder.routes().route(r -> r
        .path("/producter/**")
        .uri("lb://producter-service")
        .filter(new MyGatewayFilter())).build();
    }
}

全局过滤器(不需要注册)

@Component
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if(token != null){
            //做token校验逻辑
            return chain.filter(exchange);
        }
        System.out.println("========认证失败=====");
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete(); //请求结束
    }

    /**
     * 数值越小优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

版权声明:本文为weixin_42654295原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。