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.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
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; @Component
@Slf4j
public class HttpResponseGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -2;
} @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest serverHttpRequest = exchange.getRequest();
ServerHttpResponse originalResponse = exchange.getResponse();
String contentType = originalResponse.getHeaders().getFirst("Content-Type");
if(contentType==null||!contentType.equals(MediaType.APPLICATION_JSON_VALUE)){
return chain.filter(exchange);
} //如果是post请求,将请求体取出来,再写入
HttpMethod method = serverHttpRequest.getMethod();
long contentLength = originalResponse.getHeaders().getContentLength();
//当返回体里面没有任何数据的话不用后面的获取数据步骤
if(contentLength<1){
return chain.filter(exchange);
}
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 -> {//解决返回体分段传输
StringBuffer stringBuffer = new StringBuffer();
dataBuffers.forEach(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
DataBufferUtils.release(dataBuffer);
try {
stringBuffer.append(new String(content, "utf-8"));
} catch (Exception e) {
log.error("--list.add--error", e);
}
});
String result = stringBuffer.toString();
//TODO,result就是response的值,想修改、查看就随意而为了
String url = serverHttpRequest.getPath().toString();
String urlParams = serverHttpRequest.getQueryParams().toSingleValueMap().toString();
String accessId = "";
if( serverHttpRequest.getHeaders()!=null){
accessId= serverHttpRequest.getHeaders().getFirst("accessId");
} //log.info("请求长度:" + StringUtils.length(requestBodyStr) + ",返回data长度:" + StringUtils.length(jsonObject.getString("data")));
//log.info("请求地址:【{}】请求参数:GET【{}】|POST:【\n{}\n】,响应数据:【\n{}\n】", url, urlParams, result);
log.info("\n" + "-------------------------------------------------------------------------------->>\n" +
"locationtype: response\n" +
"Url : {}\n" +
"HttpMethod : {}\n" +
"accessId: {}\n" +
"Param : {}\n" +
"\"<<--------------------------------------------------------------------------------"
,url, method, accessId,result);
byte[] uppedContent = new String(result.getBytes(), Charset.forName("UTF-8")).getBytes();
originalResponse.getHeaders().setContentLength(uppedContent.length);
return bufferFactory.wrap(uppedContent);
}));
}
// if body is not a flux. never got there.
return super.writeWith(body);
}
};
// replace response with decorator
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}

最新文章

  1. Java和PHP哪个方向更有前途?
  2. CSS之水平垂直居中
  3. nmap报错: Failed to open device ethxxx
  4. 地理信息系统 - ArcGIS - 高/低聚类分析工具(High/Low Clustering ---Getis-Ord General G)
  5. 如何编写可维护的面向对象JavaScript代码
  6. 指向函数的指针与iOS-Block相关知识
  7. (六) 6.2 Neurons Networks Backpropagation Algorithm
  8. Razor语法小记
  9. TOMCAT之性能跟踪入门
  10. SlimDX的DirectSound模块
  11. NOPI使用手册
  12. Java学习笔记——排序算法之简单排序
  13. Spring框架学习笔记(6)——bean的继承与依赖
  14. python入门编程之mysql编程
  15. vs2017开发IOS(vs2017 xamarin 连接mac)
  16. 61.H5---利用canvas+原生js进行鼠标跟随绘图
  17. Filter防止用户访问一些未被授权的资源
  18. 使用PhoneGap搭建一个山寨京东APP(转)
  19. phpcms v9不限模型全站搜索
  20. WPF获取相对位置、坐标的方法

热门文章

  1. [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算
  2. XCTF练习题---MISC---What-is-this
  3. Django-----cookie&amp;session
  4. JAVA 基础(1)开发环境的搭建以及开发工具的选择
  5. MyBatisPlus 入门教程,这篇很赞
  6. 如何形象简单地理解java中只有值传递,而没有引用传递?
  7. 理解ASP.NET Core - 发送Http请求(HttpClient)
  8. postman 脚本和变量
  9. nginx反向代理获取用户真实ip
  10. DevOps之敏捷开发