# After 在指定条件之后

spring:
  cloud:
    gateway:
      routes:
        - id: jd_router
          uri: https://jd.com
          predicates:
            - Path=/jd
            - After=2023-08-05T17:42:47.789-07:00【时区】
#            -Before=2017-01-20T17:42:47.789-07:00[America/Denver]

# Before 在指定条件前

spring:
  cloud:
    gateway:
      routes:
        - id: jd_router
          uri: https://jd.com
          predicates:
            - Path=/jd
            - Before=2023-08-05T17:42:47.789-07:00

# Between 在指定条件之间

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00, 2017-01-21T17:42:47.789-07:00
spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=name,gao

# Header 请求头

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
            # 多个数据(正则),如果多个head 是与的关系,满足一的条件切比如满足二
            - Header=X-Request-Id, \d+
            # 匹配请求头以 Authorization 开头的正则
            - Header=Authorization, ^Bearer [a-zA-Z0-9._-]+=*$

# Host ip

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
            - Host=aaa.com:9000

# Method 请求方式

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
            - Method=GET,POST

# PATH 路径

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
                - Path=/bd

# Query 请求参数

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
            # 请求参数以name,并且参数 gr开头的
            - Query=name,gr.+
            # 请求参数有 size
            - Query=size

# Weight 权重

Weight 组,在下面的例子中,同一个组, 哪个权重越大哪个进入的最高

spring:
  cloud:
    gateway:
      routes:
        - id: jd_router
          uri: https://jd.com
          predicates:
            - Path=/jd
            - Weight=group1, 8

        - id: baidu_router
          uri: https://bd.com
          predicates:
            - Path=/**
            - Weight=group1, 2

# 自定义工厂

# 自定义Auth认证

# 自定义认证请求头

  1. 新建类并继承 AbstractRoutePredicateFactory 注意命名,因为在配置文件中根据名称
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

@Component
public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {

    public AuthRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        //这两个和config 里面进行对应
        return Arrays.asList("username", "password");
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return serverWebExchange -> {
            //获取所有的headers
            HttpHeaders headers = serverWebExchange.getRequest().getHeaders();

            //一个请求头包含多个value
            List<String> passwords = headers.get(config.getUsername());
            //只要请求头多个密码,包含了配置文件中指定的密码,就通过
            return passwords.contains(config.getPassword());
        };
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Config {
        private String username;

        private String password;
    }


}
  1. 配置文件
spring:
  cloud:
    gateway:
      routes:
        - id: jd_router
          uri: https://jd.com
          predicates:
            - Path=/jd
            - Auth=zhangsan,123