• springcloudalibaba架构(16):Gateway过滤器


    前言

    什么是过滤器?
    过滤器有什么用?
    过滤器的作用范围是什么?
    怎么样自定义过滤器?

    官网地址:https://spring.io/projects/spring-cloud-gateway#overview
    本章代码已分享至Gitee: https://gitee.com/lengcz/springcloudalibaba01.git

    第一节 过滤器的简介

    1. 什么是过滤器?

    • 过滤器就是在请求的传递中对请求和响应做一些手脚。
    • 声明周期 Pre(处理前),Post(处理后)

    2. 过滤器的生命周期

    Gateway中,Filter的生命周期只有两个,pre和post,
    (1) PRE :这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等
    (2) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header,收集统计信息和指标、将响应从微服务发送到客户端。

    在这里插入图片描述

    3. 过滤器的分类和作用范围

    Gateway的Filter从作用范围可分为GatewayFilter与GlobalFliter

    • GatewayFilter: 应用到某个路由或者一个分组的路由上。
    • GlobalFilter: 应用到所有的路由上。

    第二节 局部过滤器

    1. 内置局部过滤器

    官网地址文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
    官方文档介绍了各种内置的局部过滤器,包含了案例。
    在这里插入图片描述

    以 AddResponseHeader为例子,使用这个过滤器

    AddResponseHeader=X-Response-Red, Blue
    
    • 1

    在这里插入图片描述
    重启网关,测试
    在这里插入图片描述

    2. 如何自定义局部过滤器

    2.1 实现自定义过滤器

    需求配置Log,第一个参数控制台是否打印,第二个参数缓存日志是否打印

    1. 先在配置文件中进行配置
    Log=true,false  #开启缓存日志和控制台日志,第一个参数控制台日志,第二个参数缓存日志
    
    • 1

    在这里插入图片描述
    2. 编写内部过滤器

    package com.lcz.filters;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * 自定义的局部过滤器
     * 1. 类名必须是配置+GatewayFilterFactory
     * 2. 必须继承AbstractGatewayFilterFactory
     */
    @Component
    public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterFactory.Config> {
    
        public LogGatewayFilterFactory() {
            super(LogGatewayFilterFactory.Config.class);
        }
    
        //过滤器的逻辑
        @Override
        public GatewayFilter apply(Config config) {
            return new GatewayFilter() {
                @Override
                public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                    if (config.isCacheLog()) {
                        System.out.println("cacheLog开启了-------");
                    }
                    if (config.isConsoleLog()) {
                        System.out.println("consoleLog开启了-------");
                    }
                    Mono<Void> mono = chain.filter(exchange);
                    return mono;
                }
            };
        }
    
        //用于接收参数,需要和配置文件里的参数对应
        @Override
        public List<String> shortcutFieldOrder() {
            return Arrays.asList("consoleLog", "cacheLog");
        }
    
        @Data
        @NoArgsConstructor
        public static class Config {
            private boolean consoleLog;
            private boolean cacheLog;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    1. 启动网关测试,可以看到consoleLog打印了。
      在这里插入图片描述

    2.2 总结

    自定义的局部过滤器

    1. 类名必须是配置+GatewayFilterFactory
    2. 必须继承AbstractGatewayFilterFactory

    第四节 全局过滤器

    顾名思义,全局过滤器不和具体的路由关联,作用在所有路由上,不需要配置。通过全局过滤器可以实现对权限的统一校验,安全性校验等。

    1. 内置全局过滤器

    SpringCloud Gateway内部也是通过一系列的内置全局过滤器对整个路由转发进行处理。
    在这里插入图片描述

    2. 自定义全局过滤器

    内置的过滤器已经实现了大部分的功能,但是对应企业开发的一些业务功能处理,还是需要我们自己编写过滤器来实现的。
    开发中的鉴权逻辑

    • 当客户端第一次请求服务时,服务端对用户进行认证(登录)
    • 认证通过后,将用户信息进行加密形成token,返回给客户端,作为登录凭证
    • 以后每次请求,客户端都携带认证的token
    • 服务端对token进行解密,判断是否有效

    2.1 实现一个鉴权过滤器

    1. 编写代码,需要实现GlobalFilter, Ordered两个接口
    package com.lcz.filters;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    /**
     * 自定义鉴权全局过滤器
    * 必须实现GlobalFilter和Ordered两个接口,并实现接口的方法 */
    @Slf4j @Component public class AuthGlobalFilter implements GlobalFilter, Ordered { //过滤器逻辑 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getQueryParams().getFirst("token"); if(!StringUtils.equals("admin",token)){ log.warn("认证失败----"); exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401表示未认证 return exchange.getResponse().setComplete(); } //chain.filter继续传递向下 return chain.filter(exchange); } //返回值越小,优先级越高 @Override public int getOrder() { return 0; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    1. 启动网关测试
      在这里插入图片描述
      在这里插入图片描述

    2.2 总结

    自定义全局过滤器,只需要实现GlobalFilter, Ordered即可。
    demo里面将token放在参数里面传递只是一个演示,正常的业务逻辑当然不是这样做,这里只是为了演示。

  • 相关阅读:
    计算机毕业设计Java幼儿健康管理系统(系统+程序+mysql数据库+Lw文档)
    基于安卓大学生兼职APP设计与实现
    设计模式——装饰器模式
    【ARM 裸机】C 语言 led 驱动
    在Vue.js中,什么是mixins?它们的作用是什么?
    python列表基本操作之增删
    dubbo与springboot的集成和使用dubbo-spring-boot-starter
    <Linux> shell运行原理及Linux权限的理解
    XXE外部实体注入漏洞总结
    第60节——使用redux-toolkit实战一个商品列表的增删查改
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126279819