gateway自定义predicate

参考一下其它得predicateFactory,复制一下,根据需求改一下。


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

    private static final Log log = LogFactory.getLog(RoutePredicateFactory.class);

    private static final String MATCH_OPTIONAL_TRAILING_SEPARATOR_KEY = "matchOptionalTrailingSeparator";

    private PathPatternParser pathPatternParser = new PathPatternParser();



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

    private static void traceMatch(String prefix, Object desired, Object actual,
                                   boolean match) {
        if (log.isTraceEnabled()) {
            String message = String.format("%s \"%s\" %s against value \"%s\"", prefix,
                    desired, match ? "matches" : "does not match", actual);
            log.trace(message);
        }
    }

    public void setPathPatternParser(PathPatternParser pathPatternParser) {
        this.pathPatternParser = pathPatternParser;
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("patterns", MATCH_OPTIONAL_TRAILING_SEPARATOR_KEY);
    }

    @Override
    public ShortcutType shortcutType() {
        return ShortcutType.GATHER_LIST_TAIL_FLAG;
    }

    @Override
    public Predicate<ServerWebExchange> apply(MyAsyncPredicateFactory.Config config) {
        final ArrayList<PathPattern> pathPatterns = new ArrayList<>();
        synchronized (this.pathPatternParser) {
            pathPatternParser.setMatchOptionalTrailingSeparator(
                    config.isMatchOptionalTrailingSeparator());
            config.getPatterns().forEach(pattern -> {
                PathPattern pathPattern = this.pathPatternParser.parse(pattern);
                pathPatterns.add(pathPattern);
            });
        }
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {
                PathContainer path = parsePath(
                        exchange.getRequest().getURI().getRawPath());

                Optional<PathPattern> optionalPathPattern = pathPatterns.stream()
                        .filter(pattern -> pattern.matches(path)).findFirst();

                if (optionalPathPattern.isPresent()) {
                    PathPattern pathPattern = optionalPathPattern.get();
                    traceMatch("Pattern", pathPattern.getPatternString(), path, true);
                    PathPattern.PathMatchInfo pathMatchInfo = pathPattern.matchAndExtract(path);
                    putUriTemplateVariables(exchange, pathMatchInfo.getUriVariables());
                    return true;
                }
                else {
                    traceMatch("Pattern", config.getPatterns(), path, false);
                    return false;
                }
            }

            @Override
            public String toString() {
                return String.format("Paths: %s, match trailing slash: %b",
                        config.getPatterns(), config.isMatchOptionalTrailingSeparator());
            }
        };
    }

    @Validated
    public static class Config {

        private List<String> patterns = new ArrayList<>();

        private boolean matchOptionalTrailingSeparator = true;

        @Deprecated
        public String getPattern() {
            if (!CollectionUtils.isEmpty(this.patterns)) {
                return patterns.get(0);
            }
            return null;
        }

        @Deprecated
        public MyAsyncPredicateFactory.Config setPattern(String pattern) {
            this.patterns = new ArrayList<>();
            this.patterns.add(pattern);
            return this;
        }

        public List<String> getPatterns() {
            return patterns;
        }

        public MyAsyncPredicateFactory.Config setPatterns(List<String> patterns) {
            this.patterns = patterns;
            return this;
        }

        public boolean isMatchOptionalTrailingSeparator() {
            return matchOptionalTrailingSeparator;
        }

        public MyAsyncPredicateFactory.Config setMatchOptionalTrailingSeparator(
                boolean matchOptionalTrailingSeparator) {
            this.matchOptionalTrailingSeparator = matchOptionalTrailingSeparator;
            return this;
        }

        @Override
        public String toString() {
            return new ToStringCreator(this).append("patterns", patterns)
                    .append("matchOptionalTrailingSeparator",
                            matchOptionalTrailingSeparator)
                    .toString();
        }

    }

}

使用

     .route("myPredicate",
                        new Function<PredicateSpec, Route.AsyncBuilder>() {
                            @Override
                            public Route.AsyncBuilder apply(PredicateSpec predicateSpec) {
                                return predicateSpec.asyncPredicate(pathRoutePredicateFactory
                                        .applyAsync(c -> c.setPatterns(Arrays.asList("/myPredicate"))))
                                        .filters(f->f.stripPrefix(1))
                                        .uri("https://www.baidu.com/");
                            }
                        }
                )

readBody读取post参数,参数类型和提交参数类型需要自己比较一下。

route("modifyGetParameter", p -> p.path("/modifyGetParameter")
                        .and().readBody(HashMap.class, new Predicate<HashMap>() {
                            @Override
                            public boolean test(HashMap obj) {
                                  System.out.println(obj);
                                  return  "张三".equals(obj.get("name"));
                            }
                        })

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Cloud Gateway 中获取参数可以使用 Predicate 和 Filter 这两个组件来实现。下面给出两种常见的获取参数的方法: 1. 使用 Predicate 获取参数: 在路由配置中,可以使用 Predicate 来匹配请求,并从请求中获取参数。例如,可以使用 QueryRoutePredicateFactory 来匹配 URL 中的参数,并进行路由: ```yaml spring: cloud: gateway: routes: - id: example_route uri: http://example.com predicates: - Query=param=value ``` 上述配置将匹配具有 `param=value` 查询参数的请求,并将其路由到 `http://example.com`。 2. 使用 Filter 获取参数: 可以创建一个自定义的过滤器来获取请求中的参数。首先,实现 GlobalFilter 接口并重写过滤方法: ```java import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获取请求中的参数 String paramValue = exchange.getRequest().getQueryParams().getFirst("param"); // 进行相应的处理 // ... return chain.filter(exchange); } @Override public int getOrder() { return 0; } } ``` 上述自定义过滤器可以获取请求中名为 `param` 的查询参数,并进行相应的处理。 通过 Predicate 或 Filter,你可以根据自己的需求从请求中获取参数,并进行相应的处理。请根据你的具体场景选择适合的方法来获取参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值