spring-cloud-gateway 响应返回信息不全问题

一、获取响应返回信息不全问题:

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    if (!logConfig.isLogOpen()) {
        return chain.filter(exchange);
    }

    GatewayContext gwContext = exchange.getAttribute(GatewayContext.GW_CONTEXT_KEY);

    ServerHttpResponse response = exchange.getResponse();
    DataBufferFactory bufferFactory = response.bufferFactory();
    ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) {
        @Override
        public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
            if (body instanceof Flux) {
                Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
                return super.writeWith(fluxBody.map(dataBuffer -> {
                    byte[] content = new byte[dataBuffer.readableByteCount()];
                    dataBuffer.read(content);
                    DataBufferUtils.release(dataBuffer);

                    String responseBody = new String(content, StandardCharsets.ISO_8859_1);

                    recordExitAccessLog(gwContext,responseBody);
                    return bufferFactory.wrap(content);
                }));
            }
            return super.writeWith(body); // if body is not a flux. never got there.
        }
    };

    return chain.filter(exchange.mutate().response(decoratedResponse).build());
}

日志分两次打印

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    if (!logConfig.isLogOpen()) {
        return chain.filter(exchange);
    }

    GatewayContext gwContext = exchange.getAttribute(GatewayContext.GW_CONTEXT_KEY);

    ServerHttpResponse response = exchange.getResponse();
    DataBufferFactory bufferFactory = response.bufferFactory();
    ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) {
        @Override
        public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
            return super.writeWith(DataBufferUtils.join(Flux.from(body))
                    .map(dataBuffer -> {

                        byte[] content = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(content);
                        DataBufferUtils.release(dataBuffer);
                        return content;

                    }).flatMap(bytes -> {
                        try{
                            String responseBody = new String(bytes, StandardCharsets.ISO_8859_1);
                            recordExitAccessLog(gwContext, responseBody);
                        }catch (Exception e){
                            log.warn("EXIT RECORD ERROR :{}", e.getMessage(), e);
                            MDC.remove("requestId");
                        }
                        return Mono.just(bufferFactory.wrap(bytes));
                    }));
        }

        @Override
        public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
            return writeWith(Flux.from(body).flatMapSequential(p -> p));
        }
    };

    return chain.filter(exchange.mutate().response(decoratedResponse).build());
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值