最近在做网关改造,想要通过Gateway过滤器获取ResponseBody的值,查看了网上的帖子和官网内容:

帖子:https://cloud.tencent.com/developer/article/1384111

官网:https://github.com/spring-cloud/spring-cloud-gateway/blob/master/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java

但在实际操作中却掉坑里了,居然不起作用,就是不进重写但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方法方式试试,结果出乎意料,居然好用了!!!

真的是绞尽脑汁啊,浪费了不少时间。。。。

01-20 15:24