SpringCloud Gateway 自定义 过滤器:

SpringCloud Gateway 自定义 过滤器:

局部过滤器

过滤器要求:

在过滤器(MyParamGatewayFilterFactory)中将http://localhost:10010/api/user/8?name=xxx中的参数name的值获取到并输出到控制台;并且参数名是可变的,也就是不一定每次都是name;需要可以通过配置过滤器的时候做到配置参数名。

1,自定义过滤器命名规则 :XXXXGatewayFilterFactory

2,创建一个静态内部类Config ,里面的属性配置文件中配置的参数

​ - 过滤器名称=参数1,参数2…

3,extends AbstractGatewayFilterFactory<创建的静态内部类>

4,重写**shortcutFieldOrder()**方法

返回List参数列表为Config属性集合

return Arrays.asList(“参数1”,参数2…);

5,无参构造方法

super(Config.class);

6.编写过滤逻辑 public GatewayFilter apply(Config config)

@Override
public GatewayFilter apply(Config config) {
    return ((exchange, chain) -> {
       		//前置过滤器代码逻辑
        return chain.filter(exchange);//执行请求
			//后置过滤器代码逻辑
    });
}

注意:不要重写其他方法 ,会导致异常Unable to find GatewayFilterFactory with name xxx

7.application.yml配置过滤器

filters:
  - MyParam=name

下图为 shortcutFieldOrder()方法返回的集合为Config属性名称集合

在这里插入图片描述

完整代码:

@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {


    public MyParamGatewayFilterFactory() {
        super(MyParamGatewayFilterFactory.Config.class);
    }



    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("param");
    }



    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            if (request.getQueryParams().containsKey(config.param)) {
                System.out.println("局部过滤器获取到的参数:" + config.param + "=" + request.getQueryParams().get(config.param).get(0));
            }

            return chain.filter(exchange);

        });
    }

    public static class Config {
        //对应在配置文件中配置过滤器的时候指定的参数名列表
        private String param;

        public String getparam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }
    }


}

全局过滤器

过滤器要求:

编写全局过滤器,在过滤器中检查请求中是否携带token请求头。如果token请求头存在则放行;如果token为空或者不存在则设置返回的状态码为:未授权也不再执行下去.

1,编写一个类 ,实现 两个接口: GlobalFilter, Ordered

GlobalFilter:全局过滤拦截

Ordered:拦截器的顺序,数字越低,优先级越高

-----------------全局过滤器不用配置 --------------

@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        boolean token = exchange.getRequest().getHeaders().containsKey("token");
        System.out.println("----全局过滤器token----"+token);
        if (!token){
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            ServerHttpResponse response = exchange.getResponse();
            return  response.setComplete();
        }

        return chain.filter(exchange);

    }

    @Override
    public int getorder() {
        return 1;
    }
}

相关文章

本篇文章为大家展示了如何解决Spring Cloud 服务冲突问题,内...
本篇内容主要讲解“spring cloud服务的注册与发现怎么实现”...
本篇内容介绍了“Dubbo怎么实现Spring Cloud服务治理 ”的有...
本篇内容主要讲解“SpringCloud相关面试题有哪些”,感兴趣的...
如何分析Spring Cloud Ribbon、Spring Cloud Feign以及断路器...
这篇文章主要讲解了“springcloud微服务的组成部分有哪些”,...