Spring Cloud Gateway请求体到自定义过滤器使用的请求头

aamkag61  于 2023-05-21  发布在  Spring
关注(0)|答案(1)|浏览(167)

我是webflux的新手。我在使用webflux控制数据时遇到困难。
当写入如下时,控制器中缺少主体数据。有解决办法吗?作为主体值发送的数据被设置为头部阅读主体数据似乎是成功的。但是,数据不会添加到头值中,并且正文值信息也会丢失。

@Component
@Slf4j
public class GetFormGatewayFilterFactory extends AbstractGatewayFilterFactory<GetFormGatewayFilterFactory.Config> {
    public GetFormGatewayFilterFactory() {
        super(Config.class);
    }
    @Override
    public GatewayFilter apply(Config config) {
        //Custom Pre Filter
        return (exchange, chain) -> {

            return DataBufferUtils.join(exchange.getRequest().getBody())
                    .flatMap(dataBuffer -> {
                        //바디값 읽어오기
                        byte[] bytes = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(bytes);
                        DataBufferUtils.release(dataBuffer);
                        String body = new String(bytes, StandardCharsets.UTF_8);

                        //읽어온 바디값을 header값에 추가

                        return chain.filter(exchange.mutate().request(exchange.getRequest().mutate().header("headerName", body).build()).build());
                    });
        };
    }


    public static class Config {
//Put the configuration properties
    }

}```
nhn9ugyo

nhn9ugyo1#

需要记住的一点是,当在Webflux中阅读请求体时,您将消耗Flux。需要注意的是,这个Flux只能使用一次,这意味着您应该缓存它并将该高速缓存沿着给控制器。但是在Webflux中缓存请求体并不是最好的主意,因为它否定了WebFlux的一些优点。有关更多信息,请参阅以下链接:https://stackoverflow.com/a/76250029/6933090
在这里,您可以找到有关如何缓存请求正文的其他信息:https://www.baeldung.com/kotlin/spring-webflux-log-request-response-body

相关问题