美文网首页
自定义Gateway 断言工厂

自定义Gateway 断言工厂

作者: 吉他手_c156 | 来源:发表于2020-07-27 16:32 被阅读0次
    • 自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑和shortcutFieldOrder方法。
    • 在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
    • apply 方法的参数是自定义的配置类,在使用的时候配置参数,在 apply 方法中直接获取使用。
      命名需要以 RoutePredicateFactory 结尾,比如 AuthRoutePredicateFactory,那么在使用的时候 Auth 就是这个路由断言工厂的名称

    具体实现

    /**
     * 自定义 Gateway 断言 Auth    后面必须为 RoutePredicateFactory
     */
    @Component
    public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {
    
        public static final String AUTHO_KEY = "name";
        public static final String AUTHO_VALUE = "value";
        public AuthRoutePredicateFactory() {
            super(Config.class);
        }
    
        /**
         * 表示配置填写的顺序,例如:- Auth=zhangsan,xxx, zhangsan 代表 AUTHO_KEY , xxx 代表 AUTHO_VALUE
         * @return
         */
        @Override
        public List<String> shortcutFieldOrder() {
            return Arrays.asList(AUTHO_KEY,AUTHO_VALUE);
        }
    
        @Override
        public Predicate<ServerWebExchange> apply(Config config) {
            // 如果 Header 中携带了某个值,进行 header 的判断
            return (exchange -> {
                // 获取请求 header
                HttpHeaders httpHeaders = exchange.getRequest().getHeaders();
                // 获取指定 header
                List<String> headerList = httpHeaders.get(config.getName());
                if(headerList.contains(config.value)){
                    return true;
                }
                return false;
            });
        }
    
        public static class Config{
            private String name;
            private String value;
    
            public String getValue() {
                return value;
            }
    
            public void setValue(String value) {
                this.value = value;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    }
    

    application.yml 配置

    server:
      port: 8080
    
    spring:
      application:
        name: spring-cloud-gateway
      cloud:
        gateway:
          routes:
              # 自定义断言
            - id: auth_route
              predicates:
                # 匹配路径转发
                - Path=/auth/**
                # 匹配 header 中 一个 key 为 zhansan ,value 为 xxx 的值
                - Auth=zhangsan,xxx
              filters:
                # 去取前缀的个数,StripPrefix=1 代表去除一位,比如请求 /gateway/a/b 会转发到  /a/b
                # StripPrefix=2 去除两位 比如请求 /gateway/a/b 会转发到  /b
                - StripPrefix=1
              # 映射到的地址
              uri: https://www.taobao.com
    

    相关文章

      网友评论

          本文标题:自定义Gateway 断言工厂

          本文链接:https://www.haomeiwen.com/subject/rnnzlktx.html