问题描述: 在gateway中修改返回的响应体,在全局Filter中添加如下代码:
import org.springframework.core.Ordered;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@ComponentpublicclassRequestGlobalFilterimplementsGlobalFilter, Ordered{//...@Overridepublic Mono<Void>filter(ServerWebExchange exchange, GatewayFilterChain chain){//...
ResponseDecorator decorator=newResponseDecorator(exchange.getResponse());return chain.filter(exchange.mutate().response(decorator).build());}@OverridepublicintgetOrder(){return-1000;}}
通过.response(decorator)设置一个响应装饰器(自定义),以下是装饰器具体实现:
import cn.hutool.json.JSONObject;import org.reactivestreams.Publisher;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 reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.nio.charset.Charset;/**
* @author visy.wang
* @desc 响应装饰器(重构响应体)
*/publicclassResponseDecoratorextendsServerHttpResponseDecorator{publicResponseDecorator(ServerHttpResponse delegate){super(delegate);}@Override@SuppressWarnings(value="unchecked")public Mono<Void>writeWith(Publisher<?extendsDataBuffer> body){if(bodyinstanceofFlux){
Flux<DataBuffer> fluxBody=(Flux<DataBuffer>) body;returnsuper.writeWith(fluxBody.buffer().map(dataBuffers->{
DataBufferFactory dataBufferFactory=newDefaultDataBufferFactory();
DataBuffer join= dataBufferFactory.join(dataBuffers);byte[] content=newbyte[join.readableByteCount()];
join.read(content);
DataBufferUtils.release(join);// 释放掉内存
String bodyStr=newString(content, Charset.forName("UTF-8"));//修改响应体
bodyStr=modifyBody(bodyStr);getDelegate().getHeaders().setContentLength(bodyStr.getBytes().length);returnbufferFactory().wrap(bodyStr.getBytes());}));}returnsuper.writeWith(body);}//重写这个函数即可private StringmodifyBody(String jsonStr){
JSONObject json=newJSONObject(jsonStr);//TODO...修改响应体return json.toString();}}