1. import lombok.extern.slf4j.Slf4j;
  2. import org.reactivestreams.Publisher;
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  4. import org.springframework.cloud.gateway.filter.GlobalFilter;
  5. import org.springframework.core.Ordered;
  6. import org.springframework.core.io.buffer.DataBuffer;
  7. import org.springframework.core.io.buffer.DataBufferFactory;
  8. import org.springframework.core.io.buffer.DataBufferUtils;
  9. import org.springframework.http.HttpMethod;
  10. import org.springframework.http.MediaType;
  11. import org.springframework.http.server.reactive.ServerHttpRequest;
  12. import org.springframework.http.server.reactive.ServerHttpResponse;
  13. import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.web.server.ServerWebExchange;
  16. import reactor.core.publisher.Flux;
  17. import reactor.core.publisher.Mono;
  18.  
  19. import java.nio.charset.Charset;
  20.  
  21. @Component
  22. @Slf4j
  23. public class HttpResponseGlobalFilter implements GlobalFilter, Ordered {
  24. @Override
  25. public int getOrder() {
  26. return -2;
  27. }
  28.  
  29. @Override
  30. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  31. ServerHttpRequest serverHttpRequest = exchange.getRequest();
  32. ServerHttpResponse originalResponse = exchange.getResponse();
  33. String contentType = originalResponse.getHeaders().getFirst("Content-Type");
  34. if(contentType==null||!contentType.equals(MediaType.APPLICATION_JSON_VALUE)){
  35. return chain.filter(exchange);
  36. }
  37.  
  38. //如果是post请求,将请求体取出来,再写入
  39. HttpMethod method = serverHttpRequest.getMethod();
  40. long contentLength = originalResponse.getHeaders().getContentLength();
  41. //当返回体里面没有任何数据的话不用后面的获取数据步骤
  42. if(contentLength<1){
  43. return chain.filter(exchange);
  44. }
  45. DataBufferFactory bufferFactory = originalResponse.bufferFactory();
  46. ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
  47. @Override
  48. public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
  49. if (body instanceof Flux) {
  50. Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
  51. return super.writeWith(fluxBody.buffer().map(dataBuffers -> {//解决返回体分段传输
  52. StringBuffer stringBuffer = new StringBuffer();
  53. dataBuffers.forEach(dataBuffer -> {
  54. byte[] content = new byte[dataBuffer.readableByteCount()];
  55. dataBuffer.read(content);
  56. DataBufferUtils.release(dataBuffer);
  57. try {
  58. stringBuffer.append(new String(content, "utf-8"));
  59. } catch (Exception e) {
  60. log.error("--list.add--error", e);
  61. }
  62. });
  63. String result = stringBuffer.toString();
  64. //TODO,result就是response的值,想修改、查看就随意而为了
  65. String url = serverHttpRequest.getPath().toString();
  66. String urlParams = serverHttpRequest.getQueryParams().toSingleValueMap().toString();
  67. String accessId = "";
  68. if( serverHttpRequest.getHeaders()!=null){
  69. accessId= serverHttpRequest.getHeaders().getFirst("accessId");
  70. }
  71.  
  72. //log.info("请求长度:" + StringUtils.length(requestBodyStr) + ",返回data长度:" + StringUtils.length(jsonObject.getString("data")));
  73. //log.info("请求地址:【{}】请求参数:GET【{}】|POST:【\n{}\n】,响应数据:【\n{}\n】", url, urlParams, result);
  74. log.info("\n" + "-------------------------------------------------------------------------------->>\n" +
  75. "locationtype: response\n" +
  76. "Url : {}\n" +
  77. "HttpMethod : {}\n" +
  78. "accessId: {}\n" +
  79. "Param : {}\n" +
  80. "\"<<--------------------------------------------------------------------------------"
  81. ,url, method, accessId,result);
  82. byte[] uppedContent = new String(result.getBytes(), Charset.forName("UTF-8")).getBytes();
  83. originalResponse.getHeaders().setContentLength(uppedContent.length);
  84. return bufferFactory.wrap(uppedContent);
  85. }));
  86. }
  87. // if body is not a flux. never got there.
  88. return super.writeWith(body);
  89. }
  90. };
  91. // replace response with decorator
  92. return chain.filter(exchange.mutate().response(decoratedResponse).build());
  93. }
  94. }

java geteway 手机返回数据的更多相关文章

  1. Java线程如何返回数据

    前言 当开发者从单线程开发模式过渡到多线程环境,一个比较棘手的问题就是如何在一个线程中返回数据,众所周知,run()方法和start()方法不会返回任何值. 笔者在学习<Java Network ...

  2. java URL实现调用其他系统发送报文并获取返回数据

    模拟本系统通过Url方式发送报文到目标服务器,并获取返回数据:(实现类) import java.io.BufferedOutputStream; import java.io.BufferedRea ...

  3. Java抓取网页数据(原网页+Javascript返回数据)

    有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...

  4. Java多线程初学者指南(8):从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...

  5. Java抓取网页数据(原来的页面+Javascript返回数据)

    转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...

  6. Java实现发送HTTP的POST请求,返回数据以及请求状态

    /** * @param url:请求url * @param content: 请求体(参数) * @return errorStr:错误信息;status:状态码,response:返回数据 */ ...

  7. Java封装接口统一返回数据模板

    现在大多数都使用前后端分离开发模式,前端通过Ajax请求访问后台服务器,后台返回JSON数据供前端操作,这里编写一个统一返回数据模板类,方便日后操作 public class R extends Ha ...

  8. iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解

    写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS ...

  9. Android基础之——startActivityForResult启动界面并返回数据,上传头像

    在android应用的开发过程中,常常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在非常多应用程序的模块中,都有"我的"这个模块,在未登录 ...

随机推荐

  1. XCTF练习题---MISC---再见李华

    XCTF练习题---MISC---再见李华 flag:Stay hungry, Stay foolish. 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一张图片,其中有MD5,破解一下没有 ...

  2. 用户与安全 -(1)Linux用户及组管理

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登 ...

  3. 超详干货!Linux 环境变量配置全攻略

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux环境变量配置 在自定义安装软件的时候,经常需要 ...

  4. Centos 7.4_64位系统安装指南

    小土豆Linux学习随笔 -- 清听凌雪慕忆 目录 1. 范围 1.1标识 1.2 文档概述 2. 安装环境 3. 安装步骤 4. 注意事项 1. 范围 1.1标识 CentOS 7.4 64位系统安 ...

  5. 如何用好Nginx的gzip指令

    说一段废话 压缩响应数据有什么作用呢?问的好:从用户体验和IT成本两方面回答这个问题: 用户体验上 网速一定的情况下,传输10MB数据比传输5MB数据的时间快了一半.所以传输数据越小用户加载页面就越快 ...

  6. Vulnhub-earth

    1.信息收集 1.1找到目标主机ip vulnhub靶场通用的技巧 这里我们靶场是nat模式的 所以肯定就是在我们自己设置的一个网段范围内,我这里nat本机的地址是10.1.1.1 所处的网段就是10 ...

  7. UML类图六种关系的总结

    在UML类图中,常见的有以下几种关系: 泛化(Generalization):继承的关系,实线带三角形箭头,指向父类. 实现(Realization):实现的关系,虚线带三角形箭头,指向接口. 关联( ...

  8. Spring 中 @EnableXXX 注解的套路

    前言 在 Spring 框架中有很多实用的功能,不需要写大量的配置代码,只需添加几个注解即可开启. 其中一个重要原因是那些 @EnableXXX 注解,它可以让你通过在配置类加上简单的注解来快速地开启 ...

  9. ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例

    一.两个核心概念:bucket和metric 1.1 bucket 有如下数据 city name  北京 张三  北京 李四 天津 王五 天津 赵六 天津 王麻子 划分出来两个bucket,一个是北 ...

  10. typora的下载和基本的使用

    目录 typora的下载和基本的使用 typora的下载 typora基本的使用 选择自己喜爱的主题 创建标题 进入编程环境 改变文本样式 插入链接 插入图片 有序列表 无序列表 创建表格 单选框 表 ...