栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

Gateway 配置全局过滤器获取请求参数和响应值

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gateway 配置全局过滤器获取请求参数和响应值

【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了。

获取请求参数RequestBody
@Component
@Slf4j
@AllArgsConstructor
public class HttpRequestFilter implements GlobalFilter, Ordered {

    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
 ServerHttpRequest request = exchange.getRequest();

 String method = request.getMethodValue();
 String contentType = request.getHeaders().getFirst("Content-Type");
 if ("POST".equals(method)) {
     return DataBufferUtils.join(exchange.getRequest().getBody())
      .flatMap(dataBuffer -> {
   byte[] bytes = new byte[dataBuffer.readableByteCount()];
   dataBuffer.read(bytes);
   try {
String bodyString = new String(bytes, "utf-8");
log.info(bodyString);//打印请求参数
exchange.getAttributes().put("POST_BODY", bodyString);
   } catch (UnsupportedEncodingException e) {
e.printStackTrace();
   }
   DataBufferUtils.release(dataBuffer);
   Flux cachedFlux = Flux.defer(() -> {
DataBuffer buffer = exchange.getResponse().bufferFactory()
 .wrap(bytes);
return Mono.just(buffer);
   });

   ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
    exchange.getRequest()) {
@Override
public Flux getBody() {
    return cachedFlux;
}
   };
   return chain.filter(exchange.mutate().request(mutatedRequest)
    .build());
      });
 }
 return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
 return -200;
    }
}
获取请求响应值ResponseBody

POSTMAN工具请求里的gzip压缩头导致获取响应值一直乱码,解决gzip压缩后响应值获取

@Slf4j
@Component
public class HttpResponseFilter implements GlobalFilter, Ordered {

    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
 ServerHttpRequest request = exchange.getRequest();
 String path = request.getPath().toString();
 ServerHttpResponse originalResponse = exchange.getResponse();
 System.out.println(originalResponse.isCommitted());
 DataBufferFactory bufferFactory = originalResponse.bufferFactory();

 ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
     @Override
     public Mono writeWith(Publisher body) {

  if (body instanceof Flux) {
      Flux fluxBody = (Flux) body;
      return super.writeWith(fluxBody.buffer().map(dataBuffer -> {
   DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
   DataBuffer join = dataBufferFactory.join(dataBuffer);
   byte[] content = new byte[join.readableByteCount()];
   join.read(content);
   //释放掉内存
   DataBufferUtils.release(join);
   String s = new String(content, StandardCharsets.UTF_8);

   List strings = exchange.getResponse().getHeaders().get(HttpHeaders.CONTENT_ENCODING);
   if (!CollectionUtils.isEmpty(strings) && strings.contains("gzip")) {
GZIPInputStream gzipInputStream = null;
try {
    gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(content), content.length);
    StringWriter writer = new StringWriter();
    IOUtils.copy(gzipInputStream, writer, "UTF-8");
    s = writer.toString();

} catch (IOException e) {
    log.error("====Gzip IO error", e);
} finally {
    if (gzipInputStream != null) {
 try {
     gzipInputStream.close();
 } catch (IOException e) {
     log.error("===Gzip IO close error", e);
 }
    }
}
   } else {
s = new String(content, StandardCharsets.UTF_8);
   }
   log.info("bodyString: {}", s);//打印请求响应值
   return bufferFactory.wrap(content);
      }));
  }
  return super.writeWith(body);
     }
 };
 return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }

    @Override
    public int getOrder() {
 return -200;
    }
}

赵小胖个人博客

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号