/** * 缓存body内容. * * @return */ public Mono<Void> readBody(ServerWebExchange exchange, GatewayFilterChain chain, GatewayContext gatewayContext) { log.info("readJsonBody start"); // 解析exchange,返回一个全新的mono(缓存body的mono) Mono<Void> monoData = DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> { // 创建一个容量为dataBuffer容量大小的字节数组 byte[] bytes = new byte[dataBuffer.readableByteCount()]; // dataBuffer类容读取到bytes中 dataBuffer.read(bytes); // 释放缓冲区 DataBufferUtils.release(dataBuffer); // 创建新缓冲区并写入数据 Flux<DataBuffer> cachedFlux = Flux.defer(() -> { DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes); DataBufferUtils.retain(buffer); return Mono.just(buffer); }); // 由于原来的request请求参数被消费,需要提供新的请求
webFlux获取不到body体解决办法
最新推荐文章于 2024-07-24 23:46:08 发布
该段代码展示了如何在WebFlux中缓存HTTP请求体。通过使用`DataBufferUtils.join`合并请求体,然后将其转换为字节数组,接着创建一个新的Flux以在后续处理中重复使用这个缓存的体。最后,通过创建装饰后的`ServerHttpRequest`,确保在过滤链中可以访问到请求体。
摘要由CSDN通过智能技术生成