服务网关Gateway-过滤器

过滤器

Filter分为局部和全局两种:

  • 局部Filter(GatewayFilter的子类)是作用于单个路由。如果需要使用全局路由,需要配置Default Filters。
  • 全局Filter(GlobalFilter的子类),不需要配置路由,系统初始化作用到所有路由上。

服务网关Gateway-过滤器_第1张图片

  局部过滤器GatewayFilter

 过滤器工厂 GatewayFilterFactory

 Spring提供了31种不同的路由过滤器工厂。例如:

服务网关Gateway-过滤器_第2张图片

 配置在路由下的过滤器只对当前路由的请求生效

 服务网关Gateway-过滤器_第3张图片

 默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

服务网关Gateway-过滤器_第4张图片

 所有路由都会携带这个请求头

全局过滤器 GlobalFilter  

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口

 public interface GlobalFilter {
  
/**
    *
  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理

    *

    * @param exchange 请求上下文,里面可以获取RequestResponse等信息
    * @param chain 用来把请求委托给下一个过滤器
    * @return {@code Mono} 返回标示当前过滤器业务结束
    */
  
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

 

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

参数中是否有authorization

authorization参数值是否为admin

如果同时满足则放行,否则拦截

自定义类,实现GlobalFilter接口,添加@Order注解:

过滤器必须设置执行顺序

//设置优先执行权,越小越优先
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1,获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap params = request.getQueryParams();
        //2,获取参数中的authorization 参数
        String auth = params.getFirst("authorizetion");
        //3,判断参数值是否等于admin
        if("admin".equals(auth)){
            //4,是则放行
            return chain.filter(exchange);
        }
        //5,否则拦截
        //5.1 设置状态码HttpStatus.UNAUTHORIZED(未登录)
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //5.2 拦截请求
        return exchange.getResponse().setComplete();
    }
}

重启运行,没有authorization参数,我们可以看到已经报错401未登录错误

服务网关Gateway-过滤器_第5张图片

 在url网址栏内加上authorization参数,正常访问

服务网关Gateway-过滤器_第6张图片

 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

你可能感兴趣的:(后端,分布式)