1. 我的版本:
spring-cloud:Hoxton.RELEASE
spring-boot:2.2.2.RELEASE
spring-cloud-starter-gateway
2. 问题: 之前试过一些方法拦截到了返回体,但是第一次的请求返回体参数输出是断开的,后来找到方法使其完整输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 import io.netty.util.ReferenceCountUtil;import lombok.extern.slf4j.Slf4j;import org.reactivestreams.Publisher;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferFactory;import org.springframework.core.io.buffer.DataBufferUtils;import org.springframework.core.io.buffer.DefaultDataBufferFactory;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.http.server.reactive.ServerHttpResponseDecorator;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.nio.charset.Charset;@Slf 4j@Component public class ModifyResponseBodyFilter implements GlobalFilter , Ordered { @Override public Mono<Void> filter (ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpResponse originalResponse = exchange.getResponse(); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) { @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.buffer().map(dataBuffers -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); DataBuffer join = dataBufferFactory.join(dataBuffers); byte [] content = new byte [join.readableByteCount()]; join.read(content); DataBufferUtils.release(join); String str = new String(content, Charset.forName("UTF-8" )); log.info("返回体:{}" , str); originalResponse.getHeaders().setContentLength(str.getBytes().length); return bufferFactory.wrap(str.getBytes()); })); } return super .writeWith(body); } }; return chain.filter(exchange.mutate().response(decoratedResponse).build()); } @Override public int getOrder () { return -1 ; } }
我的代码使用示例项目: 微服务项目实战练习
参考博客:https://blog.csdn.net/a807719447/article/details/102823340