GlobalFilter全局过滤器【自定义过滤】及过滤器链的执行顺序

一、为什么需要GlobalFilter全局过滤器?

全局过滤器的作用:
和GatewayFilter一样,处理所有进入网关的请求和微服务响应。
区别在哪?
GatewayFilter通过配置定义,每项的处理逻辑是固定的。
GlobalFilter的逻辑需要自己写代码实现。
也就是说GlobalFilter的优势在于:
GlobalFilter弥补了GatewayFilter没办法自定义业务实现逻辑的问题。

二、如何自定义全局过滤器

以下述需求为例:
定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  1. 参数中是否有authorization,
  2. authorization参数值是否为admin
  3. 如果同时满足则放行,否则拦截

实现:
在gateway中定义一个过滤器:

package cn.itcast.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}

GlobalFilter接口:

public interface GlobalFilter {
    /**
     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     *
     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器 
     * @return {@code Mono} 返回标示当前过滤器业务结束
     */
    Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

总结
在filter实现方法中编写自定义逻辑,可以实现下列功能:

  1. 登录状态判断
  2. 权限校验
  3. 请求限流等

三、当前路由的过滤器、DefaultFilter、GlobalFilter等过滤器的执行顺序

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。
GlobalFilter全局过滤器【自定义过滤】及过滤器链的执行顺序_第1张图片

排序的规则是什么呢?

  1. 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
  2. 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

过滤器链执行顺序如何指定?

  1. 实现Ordered接口,或者添加@Order注解来指定order值。
  2. 路由过滤器和defaultFilter的order由Spring指定,默认顺序:按照声明顺序从1递增

你可能感兴趣的:(gateway,分布式,java,spring,cloud,微服务)