gpt4 book ai didi

java - Spring Boot网关中拦截Http请求体

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:42 27 4
gpt4 key购买 nike

我们正在运行一堆微服务,这些微服务由中央网关 (org.springframework.cloud:spring-cloud-starter-gateway:2.1.0) 保护,该网关将请求路由到其背后负责的微服务。

我们现在想要添加一项服务,该服务应通过用于跟踪/统计原因的静态接口(interface)获取每个请求的重要部分作为副本(如 header 、请求路径、请求正文...)。为了仅在一处提供此代码,我们希望将其直接添加到网关服务中。

实现 WebFilter 似乎是一个好的开始,但我遇到了请求正文 Flux<DataBuffer> 的问题。 .

订阅它会导致错误:Only one connection receive subscriber allowed. ,因为它是单播,禁止内容的多个接收者。

@Slf4j
@Configuration
public class InterceptConfig implements WebFilter {

private final StatisticServiceProperties properties;

@Autowired
public InterceptConfig(StatisticServiceProperties properties) {
this.properties = properties;
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
log.debug("request intercepted. sending to statistic service : " + request.getURI().toString());

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
request.getBody().subscribe(dataBuffer -> {
try {
byteArrayOutputStream.write(dataBuffer.asInputStream().readAllBytes());
} catch (IOException e) {
log.debug("couldn't extract body from request", e);
}
});

new StatisticServiceClient(
new RestTemplate(),
properties.getBaseUrl() + "/statistic"
).createStatistic(
new CreateStatisticRequest(
new Date(),
request.getURI(),
request.getHeaders(),
byteArrayOutputStream.toByteArray()
)
);
return chain.filter(exchange);
}
}

有没有办法在不破坏应用程序的情况下获取请求正文的内容?

编辑:2019年11月18日

我找到了一个可以解决这个问题的解决方案: https://github.com/spring-cloud/spring-cloud-gateway/issues/747#issuecomment-451805283

最佳答案

关于java - Spring Boot网关中拦截Http请求体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878326/

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