一.自定义过滤器


我们以GlobalFilter为例来详细解读一下过滤方法:
1.方法参数:第一个方法参数类型为ServerWebExchange,这个对象可以理解成网关内部的一个上下文对象。保存网关内一些共享数据。
2.第二个参数类型为GatewayFilterChain,这个是过滤器链,当我们自定义的过滤器执行完后,可以调用这个阐述来执行下一个过滤器。
3.返回值:返回值类型为Mono,网关过滤器内部分成pre和post两部分,实现filter方法内部所有逻辑都属于pre,当pre执行完我们可以调用chain,执行下一个过滤器。下一个过滤器执行完会立刻返回Mono。

二.代码编写实现filter方法
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 {@Overridepublic 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之前执行@Overridepublic int getOrder() {return 0;}
}
通过实现Ordered接口来实现过滤器顺序的排序。其中数字越大优先级越低。我们要求自定义过滤器要在NettyRoutingFilter之前,因此我们查看一下NettyRoutingFilter的过滤器优先级,发现他是int类型的最大值,即优先级排在最后。
我们的优先级为0,满足条件。
