在GatewayFilter

时间:2018-07-23 18:19:54

标签: project-reactor spring-cloud-gateway

我正在构建GatewayFilter,但是在处理没有数据的情况时遇到问题。这是GatewayFilterFactory <>的示例:

    return (exchange, chain) -> getDataFromRedis()
        .flatMap(redisData -> {
            ServerHttpRequest request = exchange.getRequest().mutate()
                .header("header", redisData).build();
            return chain.filter(exchange.mutate().request(request).build());
        });

这是getDataFromRedis方法:

Mono<String> getDataFromRedis() {
    return redis.get("key");
}

它返回带有字符串值的Mono,如果找不到则为空。

上面的示例按预期工作,但是当未找到数据redis并返回空Mono时,则需要它来返回重定向。这是我的尝试:

    return (exchange, chain) -> getDataFromRedis()
        .flatMap(redisData -> {
            ServerHttpRequest request = exchange.getRequest().mutate()
                .header("header", redisData).build();
            return chain.filter(exchange.mutate().request(request).build());
        })
        .switchIfEmpty(Mono.defer(() -> {
            exchange.getResponse().setStatusCode(HttpStatus.FOUND);
            exchange.getResponse().getHeaders().add(HttpHeaders.LOCATION, "some other url");
            return exchange.getResponse().setComplete();
        }));

switchIfEmpty中的延迟单声道总是被调用,而不管redis中是否有数据。

总而言之,我需要过滤器添加从Redis获取的标头值,但是如果没有可用数据则重定向。

0 个答案:

没有答案