微服务-23.网关登录校验-自定义GlobalFilter

一.自定义过滤器

我们以GlobalFilter为例来详细解读一下过滤方法:

1.方法参数:第一个方法参数类型为ServerWebExchange,这个对象可以理解成网关内部的一个上下文对象。保存网关内一些共享数据。

2.第二个参数类型为GatewayFilterChain,这个是过滤器链,当我们自定义的过滤器执行完后,可以调用这个阐述来执行下一个过滤器。

3.返回值:返回值类型为Mono,网关过滤器内部分成pre和post两部分,实现filter方法内部所有逻辑都属于pre,当pre执行完我们可以调用chain,执行下一个过滤器。下一个过滤器执行完会立刻返回Mono。

二.代码编写实现filter方法

java 复制代码
package com.hmall.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import org.springframework.core.Ordered;

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders headers = request.getHeaders();
        System.out.println("获取请求头:" + headers);
        return chain.filter(exchange);      // 放行到下一个过滤器
    }

    // 定义该过滤器的优先级,数值越小优先级越高。NettyRoutingFilter默认优先级为Integer.MAX_VALUE,即最小优先级,我们设置为0可以保证优先级在NettyRoutingFilter之前执行
    @Override
    public int getOrder() {
        return 0;
    }
}

通过实现Ordered接口来实现过滤器顺序的排序。其中数字越大优先级越低。我们要求自定义过滤器要在NettyRoutingFilter之前,因此我们查看一下NettyRoutingFilter的过滤器优先级,发现他是int类型的最大值,即优先级排在最后。

我们的优先级为0,满足条件。