gpt4 book ai didi

spring-webflux - spring webflux webfilter 去除请求体

转载 作者:行者123 更新时间:2023-12-05 05:58:17 29 4
gpt4 key购买 nike

我创建了一个过滤器,我可以在其中访问有效负载的主体并对其执行一些逻辑(现在假设我记录主体)。在最后一步中,我返回了 Mono,但是当请求通过 Controller 继续发送到服务时,它会抛出请求正文丢失的错误请求。

过滤器代码:

    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
HttpHeaders headers = serverWebExchange.getRequest().getHeaders();
String domain = headers.getFirst("domain");
return serverWebExchange.getRequest().getBody()
.single()
.flatMap(body -> Mono.just(parseBody(body)))
.flatMap(s -> webFilterChain.filter(serverWebExchange));
}

private String parseBody(DataBuffer fbody) {
System.out.println("parsing body");
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
Channels.newChannel(baos).write(fbody.asByteBuffer().asReadOnlyBuffer());
} catch (IOException e) {
e.printStackTrace();
}
return baos.toString(StandardCharsets.UTF_8);
}

错误:org.springframework.web.server.ServerWebInputException: 400 BAD_REQUEST “请求正文丢失”

什么会导致这种行为?

最佳答案

原因是你只能读一次正文(https://github.com/spring-cloud/spring-cloud-gateway/issues/1587)

您正在此处阅读它:serverWebExchange.getRequest().getBody() 因此在请求中省略了它。

一个解决方案是缓存正文,您可以使用例如 ReadBodyRoutePredicateFactory ( https://github.com/spring-cloud/spring-cloud-gateway/issues/1307 )。

确保 RemoveCachedBodyFilter 已启用,以便释放正文,这样您就不会发生内存泄漏。

关于spring-webflux - spring webflux webfilter 去除请求体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68566554/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com