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的属性名称集合

SpringCloud Gateway 自定义 过滤器:

完整代码:

@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(Hystrix,Gateway)


下一篇:gateway路由设置、跨域配置等