springgateway自定义过滤器

自定义过滤器分两种

全局过滤器:实现globalFilter和order接口就行

局部过滤器:实现AbstractGatewayFilterFactory接口并自定义或者使用父类的Config类  然后还要在配置文件中将过滤器进行配置(指明哪种路由用到自定义过滤器)

全局过滤器EG:

 

import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


@Component
public class GatawayGlobalAuthCheckFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("所有服务进来都要先验证");
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        String token = request.getQueryParams().getFirst("token");
        if ("".equalsIgnoreCase(token)) {
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
        } else {
            //这里做业务验证成功
            return chain.filter(exchange);
        }
        return exchange.getResponse().setComplete();
    }

    //过滤器的顺序 从小到大 执行顺序
    @Override
    public int getOrder() {
        return 0;
    }
}

局部过滤器:

package com.zg.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;


//自定义过滤器 要在yml文件里配置自定义过滤器的过滤器名称MyCustom (MyCustom-GatewayFilterFactory)
// (GatewayFilterFactory是默认名称,前面的就是自定义过滤器的名称)
//  filters:
//    - MyCustomFilter=condition1,condition2,condition3,condition4
@Order(1)
@Component
public class MyCustomGatewayFilterFactory
        extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {

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


    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            System.out.println("进入自定义过滤器");
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();
            String key = config.getParam();
            System.out.println(key);
            return chain.filter(exchange);
        });
    }

    /**
     *  如果是自定义config 则需要重写该方法返回list集合 以便routdefine通过反射传回参数
     *  ShortcutConfiguratble 这个类获取配置
     *  RouteDefinitionRouteLocator.getFilters 获得所有过滤器 然后按顺序执行
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        List<String> list = new ArrayList<>();
        list.add("param");
        list.add("param2");
        list.add("param3");
        list.add("param4");
        return list;
    }

    /**
     * 你再路由配置那里给过滤器设置了多少参数那么就创建多少个参数变量来接收值
     * 我在过滤器那里设置了四个参数 因此这里也设置四个
     *       routes:
     *         - id: nacos-custom1-service
     *           #lb是负载均衡 lb://注册的服务名
     *           uri: lb://nacos-custom1-service
     *           predicates: #路由断言 路由断言path中的第一个词不能和服务名相同 相同会被去除掉
     *             - Path=/custom1Service/** #第一个前缀就是你要发布出去的服务API名称 可以自定义 通过过滤器删掉就行
     *           filters:
     *             - StripPrefix=1
     *             - MyCustom=key1,key2,key3,value4 #自定义局部过滤器 类名:MyCustomFilterGatewayFilterFactory
     */
    static public class Config {
        private String param;
        private String param2;
        private String param3;
        private String param4;

        public String getParam2() {
            return param2;
        }

        public void setParam2(String param2) {
            this.param2 = param2;
        }

        public String getParam3() {
            return param3;
        }

        public void setParam3(String param3) {
            this.param3 = param3;
        }

        public String getParam4() {
            return param4;
        }

        public void setParam4(String param4) {
            this.param4 = param4;
        }

        public String getParam() {
            return param;
        }

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


}

  配置文件:自定义局部过滤器的名称一定是“GatewayFilterFactory”前面那一部分 原因是在路由定义创建的时候通过类名称remove了后面的通用名称

测试:

 

posted on 2024-06-29 03:35  丶柚子  阅读(1)  评论(0编辑  收藏  举报

导航