0
点赞
收藏
分享

微信扫一扫

自定义Gateway 断言工厂

在觉 2021-09-21 阅读 40
日记本
  • 自定义路由断言工厂需要继承 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
举报

相关推荐

0 条评论