微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐