diff --git a/cloud-demo/gateway/src/main/java/cn/bunny/gateway/predicates/VipRoutePredicateFactory.java b/cloud-demo/gateway/src/main/java/cn/bunny/gateway/predicates/VipRoutePredicateFactory.java new file mode 100644 index 0000000..17c18b1 --- /dev/null +++ b/cloud-demo/gateway/src/main/java/cn/bunny/gateway/predicates/VipRoutePredicateFactory.java @@ -0,0 +1,50 @@ +package cn.bunny.gateway.predicates; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; +import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; +import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.server.ServerWebExchange; + +import java.util.List; +import java.util.function.Predicate; + +@Component +public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory { + + public VipRoutePredicateFactory() { + super(Config.class); + } + + @Override + public List shortcutFieldOrder() { + return List.of("param", "value"); + } + + @Override + public Predicate apply(Config config) { + return (GatewayPredicate) serverWebExchange -> { + ServerHttpRequest request = serverWebExchange.getRequest(); + + String first = request.getQueryParams().getFirst(config.param); + + return StringUtils.hasText(first) && first.equals(config.value); + }; + } + + @Getter + @Setter + @Validated + public static class Config { + @NotEmpty + private String param; + + @NotEmpty + private String value; + } +} diff --git a/cloud-demo/gateway/src/main/resources/application-route.yaml b/cloud-demo/gateway/src/main/resources/application-route.yaml index c44b01e..42e676b 100644 --- a/cloud-demo/gateway/src/main/resources/application-route.yaml +++ b/cloud-demo/gateway/src/main/resources/application-route.yaml @@ -13,5 +13,23 @@ spring: args: patterns: /api/product/** matchTrailingSlash: true + - id: bing-route + uri: https://cn.bing.com/ + predicates: + - name: Path + args: + patterns: /search + - name: Query + args: + param: q + regexp: 被世界温柔以待 + # 短写法 + # - Vip=User,bunny + + # 长写法 + - name: Vip + args: + param: user + value: bunny diff --git a/cloud-demo/images/image-20250527140215610.png b/cloud-demo/images/image-20250527140215610.png new file mode 100644 index 0000000..3b9aea4 Binary files /dev/null and b/cloud-demo/images/image-20250527140215610.png differ