最近在做网关改造,想要通过Gateway过滤器获取ResponseBody的值,查看了网上的帖子和官网内容:
帖子:https://cloud.tencent.com/developer/article/1384111
但在实际操作中却掉坑里了,居然不起作用,就是不进重写但writeWith方法
1 @Component 2 @Order(-2) 3 public class EncryptResponseBodyFilter implements GlobalFilter { 4 5 @Override 6 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 7 ServerHttpResponse originalResponse = exchange.getResponse(); 8 DataBufferFactory bufferFactory = originalResponse.bufferFactory(); 9 ServerHttpResponseDecorator response = new ServerHttpResponseDecorator(originalResponse) { 10 11 @Override 12 public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { 13 if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) { 14 15 Flux<? extends DataBuffer> fluxBody = Flux.from(body); 16 return super.writeWith(fluxBody.map(dataBuffer -> { 17 // probably should reuse buffers 18 byte[] content = new byte[dataBuffer.readableByteCount()]; 19 dataBuffer.read(content); 20 //释放掉内存 21 DataBufferUtils.release(dataBuffer); 22 String s = new String(content, Charset.forName("UTF-8")); 23 //TODO,s就是response的值,想修改、查看就随意而为了 24 byte[] uppedContent = s.getBytes(); 25 return bufferFactory.wrap(uppedContent); 26 })); 27 } 28 return super.writeWith(body); 29 } 30 31 @Override 32 public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { 33 return writeWith(Flux.from(body) 34 .flatMapSequential(p -> p)); 35 } 36 };37 return chain.filter(exchange.mutate().response(response).build()); 38 }
后来与帖子和官网代码内容对比,只有Order的方式不同,就换了下实现Ordered重写getOrder方法方式试试,结果出乎意料,居然好用了!!!
真的是绞尽脑汁啊,浪费了不少时间。。。。