Spring Cloud Gateway 修改返回的响应体

2022-07-07 09:28:22

问题描述: 在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();}}
  • 作者:北海有谷堆
  • 原文链接:https://blog.csdn.net/xhom_w/article/details/110061729
    更新时间:2022-07-07 09:28:22