自定义GatewayFilter

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

1、实现GatewayFilter接口

GatewayFilter 一般作用在某一个路由上,需要实例化创建才能使用,局部过滤器需要实现接口GatewayFilter、Ordered

创建com.itheima.filter.PayFilter代码如下:

public class PayFilter implements GatewayFilter,Ordered {

    /***

     * 过滤器执行拦截

     * @param exchange

     * @param chain

     * @return

     */

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        System.out.println("GatewayFilter拦截器执行---pre-----PayFilter");

        return chain.filter(exchange).then(Mono.fromRunnable(()->{

            System.out.println("GatewayFilter拦截器执行---post-----PayFilter");

        }));

    }

    @Override

    public int getOrder() {

        return 0;

    }

}

使用局部过滤器:(使用下面RouteLocator的时候,配置文件中的路由记得注释或删除)

/***

 * 路由配置

 * @param builder

 * @return

 */

 @Bean

    public RouteLocator routeLocator(RouteLocatorBuilder builder) {

        return builder.routes()

                .route("hailtaxi-driver", r -> r.path("/api/driver/**")

                        .and().cookie("username","itheima")

                        .and().header("token","123456")

                                .filters(f->f.filter(new PayFilter()).addResponseHeader("X-Response-Default-MyName", "itheima")

                                        .addRequestHeader("myheader", "1234567")

                                .stripPrefix(1)

                                )

                       // .and().method(HttpMethod.POST)

                        .uri("lb://hailtaxi-driver")

                        //.filter(new PayFilter())

                 )

                .route("hailtaxi-order", r -> r.path("/order/**").uri("lb://hailtaxi-order"))

                .route("hailtaxi-pay", r -> r.path("/pay/**").uri("lb://hailtaxi-pay"))

                .build();

    }

为了更好看到效果,我们在RouterFilter添加System.out.println("GlobalFilter拦截器执行");再访问测试。

访问:http://localhost:8001/api/driver/info/1,注意使用postman发送请求时添加请求头,添加cookie。

继承GatewayFilterFactory

如果定义局部过滤器,想在配置文件中进行配置来使用,可以继承AbstractGatewayFilterFactory<T>抽象类或者AbstractNameValueGatewayFilterFactory

代码的编写可以参考:StripPrefixGatewayFilterFactoryAddRequestHeaderGatewayFilterFactory

过滤器工厂默认命名规则必须按照"名称"+GatewayFilterFactory,如上StripPrefixGatewayFilterFactory的过滤器名称为StripPrefix** **2.1、继承AbstractGatewayFilterFactory`

需求:

在网关中统一支付方式,编写一个过滤器:PayMethodGatewayFilterFactory

1、编写过滤器

@Slf4j

@Component //一定要将其交给spring容器管理

public class PayMethodGatewayFilterFactory extends AbstractGatewayFilterFactory<PayMethodGatewayFilterFactory.Config> {

    public PayMethodGatewayFilterFactory() {

        super(Config.class);

    }

    @Override

    public GatewayFilter apply(Config config) {

        return (exchange, chain) -> {

            String paymethod = config.getPayMethod();

            String msg = config.getMsg();

            log.info("PayMethodGatewayFilterFactory 加载到的配置信息为:{}---{}",paymethod,msg);

            //将paymethod添加到请求头中

            exchange.getRequest().mutate().header("paymethod",paymethod);

            return chain.filter(exchange);

        };

    }

    @Override

    public List<String> shortcutFieldOrder() {

        return  Arrays.asList("payMethod","msg");//指定从yml中提前出来的配置信息填充到配置类中哪个属性,按规则配置

    }

    @Override

    public ShortcutType shortcutType() {

        return ShortcutType.DEFAULT;//默认规则

    }

    /**

     * 加载从yml中提取出来的配置信息

     */

    @Data

    public static class Config {

        private String payMethod;

        private String msg;

    }

}

2、配置文件中使用如下:

    gateway:

      #路由配置

      routes:

        #唯一标识符

        - id: hailtaxi-driver

          uri: lb://hailtaxi-driver

          #路由断言

          predicates:

            - Path=/driver/**

            - Cookie=username,itheima

            - Header=token,^(?!\d+$)[\da-zA-Z]+$

            - Method=GET,POST

            - Token=Authorization

          filters:

            - PayMethod=alipay,业务整合

再次测试,查看hailtaxi-driver 服务接收到请求后是否多了paymethod请求头信息

2.2、继承AbstractNameValueGatewayFilterFactory

直接查看AddRequestHeaderGatewayFilterFactory源码,分析即可!

最后更新于