gateway中filter的使用

1,033 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

gateway中filter的使用

1.局部过滤器GatewayFilter

第一种

使用局部过滤器首先继承AbstractGatewayFilterFactory抽象类

@Component
public class AuthGatewayFilter extends AbstractGatewayFilterFactory {

    @Autowired
    private IgnoreWhiteProperties ignoreWhiteProperties;

    @Override
    public GatewayFilter apply(Object config) {

        //返回Gateway对象
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            String path = request.getURI().getPath();
            // 如果是白名单路径直接放行
            if (ignoreWhiteProperties.getWhites().contains(path)) {
                return chain.filter(exchange);
         } else {
                throw new ServiceBizException("令牌认证失败", 401)
            }

            return chain.filter(exchange)
        };
    }
}

第二种

实现 GatewayFilter接口

@Component
public class AuthGatewayFilter implements GatewayFilter {

    @Autowired
    private IgnoreWhiteProperties ignoreWhiteProperties;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        // 如果是白名单路径直接放行
        if (ignoreWhiteProperties.getWhites().contains(path)) {
            return chain.filter(exchange);
        }
        return chain.filter(exchange);
    }
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {

    @Autowired
    private AuthGatewayFilter authGatewayFilter;

    @Override
    public GatewayFilter apply(Object config) {
        return authGatewayFilter;
    }
}

局部过滤器还需要再配置文件中指定使用哪一个过滤器

        - id: mt-user-service // 服务名
          uri: lb://mt-user-service
          predicates:
            - Path=/api/mtuser/** // 路由匹配以/api/mtuser/开头的请求都转发到mt-user-service服务
          filters:
            - StripPrefix=2 // 转发到mt-user-service的真实路径是/api/mtuser/**后的**,1的话就是过滤一层变成/mtuser/**
            - Auth // 指定使用的过滤器AuthGatewayFilter写成Auth就可以了
  • predicates:- Path指定路径前缀
  • filters:- StripPrefix=2过滤路径前缀几层
  • filters:- Auth使用的局部过滤器名称

2.全局过滤器

@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Autowired
    private IgnoreWhiteProperties ignoreWhiteProperties;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        // 如果是白名单路径直接放行
        if (ignoreWhiteProperties.getWhites().contains(path)) {
            return chain.filter(exchange);
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }

}

实现GlobalFilter接口中的filter方法,具体的处理逻辑与局部过滤器一致。

  • GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下
  • GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上