提交 15d24592 authored 作者: 000516's avatar 000516 提交者: Coding

gateway返回信息中,修改返回信息流配置(防止同一个字的字节码被从中间截取)

Merge Request: gateway返回信息中,修改返回信息流配置(防止同一个字的字节码被从中间截取) Created By: @李秋林 Accepted By: @李秋林 URL: https://g-pkkp8204.coding.net/p/promotion/d/promotion-gateway/git/merge/30?initial=true
......@@ -51,11 +51,10 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
long millis = System.currentTimeMillis();
ServerHttpRequest request = exchange.getRequest();
URI URIPath = request.getURI();
String path = request.getPath().value();
String method = request.getMethodValue();
HttpHeaders header = request.getHeaders();
log.info("------------- 开始 -------------");
log.info("请求request信息:\nURI = {}\npath = {}\nmethod = {}\nheader = {}。", URIPath, path, method, header);
log.info("\n请求request信息:\nURI = {}\nheader = {}。", URIPath, header);
String url = exchange.getRequest().getURI().getPath();
// 1、判断url是否放行
......@@ -86,7 +85,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
dataBuffer.read(bytes);
try {
String bodyString = new String(bytes, "utf-8");
log.info("请求参数:\n" + bodyString);
log.info("\n请求参数:\n" + bodyString);
exchange.getAttributes().put("POST_BODY", bodyString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
......@@ -105,7 +104,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
return cachedFlux;
}
};
log.info("------------- 结束 用时{}s-------------", System.currentTimeMillis() - millis);
log.info("------------- 结束-------------", System.currentTimeMillis() - millis);
return chain.filter(exchange.mutate().request(mutatedRequest)
.build());
});
......
package com.promotion.gateway.filter;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.wangxiaolu.promotion.common.redis.RedisKeys;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
......@@ -9,7 +13,11 @@ 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.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
......@@ -17,7 +25,11 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/**
* @author : liqiulin
......@@ -45,18 +57,35 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
return super.writeWith(fluxBody.map(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
// return super.writeWith(fluxBody.map(dataBuffer -> {
return super.writeWith(fluxBody.buffer().map(dataBuffer -> {
//如果响应过大,会进行截断,出现乱码,然后看api DefaultDataBufferFactory有个join方法可以合并所有的流,乱码的问题解决
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffer);
byte[] content = new byte[join.readableByteCount()];
join.read(content);
//释放掉内存
DataBufferUtils.release(dataBuffer);
//responseData就是下游系统返回的内容,可以查看修改
String responseData = new String(content, Charset.forName("UTF-8"));
DataBufferUtils.release(join);
//打印响应日志
log.info("------------- 返回信息 -------------");
log.info(responseData);
log.info(new String(content, StandardCharsets.UTF_8));
log.info("------------- 返回信息 -------------");
byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes();
return bufferFactory.wrap(uppedContent);
return bufferFactory.wrap(content);
// byte[] content = new byte[dataBuffer.readableByteCount()];
// dataBuffer.read(content);
// //释放掉内存
// DataBufferUtils.release(dataBuffer);
// //resultContent就是下游系统返回的内容,可以查看修改
// String responseData = new String(content, Charset.forName("UTF-8"));
// log.info("------------- 返回信息 -------------");
// log.info(responseData);
// log.info("------------- 返回信息 -------------");
// byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes();
// return bufferFactory.wrap(uppedContent);
}));
} else {
log.error("响应code异常:{}", getStatusCode());
......@@ -64,6 +93,10 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
return super.writeWith(body);
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
return chain.filter(exchange.mutate().
response(decoratedResponse).
build());
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论