缓存body过滤器问题
来源:7-14 验证网关微服务功能可用性

慕先生1519990
2021-11-20
老师你好:
请问在GlobalCacheRequestBodyFilter我这个webflux的相关代码都是直接复制的老师,然后我debug运行
// DataBufferUtils.join 拿到请求中的数据 --> DataBuffer
return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
// 确保数据缓冲区不被释放, 必须要 DataBufferUtils.retain
DataBufferUtils.retain(dataBuffer);
// defer、just 都是去创建数据源, 得到当前数据的副本
Flux<DataBuffer> cachedFlux = Flux.defer(() ->
Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));
// 重新包装 ServerHttpRequest, 重写 getBody 方法, 能够返回请求数据
ServerHttpRequest mutatedRequest =
new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
// 将包装之后的 ServerHttpRequest 向下继续传递
return chain.filter(exchange.mutate().request(mutatedRequest).build());
});
在这里打断点,但是进去就跳到了FilteringWebHandler,不能进入下一个过滤器
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return this.delegate.filter(exchange, chain);
}
写回答
1回答
-
张勤一
2021-11-22
同学你好:
断点调试的话,需要你自己去研究下了,这没办法去描述怎么做。
00
相似问题