提交 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 { ...@@ -51,11 +51,10 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
long millis = System.currentTimeMillis(); long millis = System.currentTimeMillis();
ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest request = exchange.getRequest();
URI URIPath = request.getURI(); URI URIPath = request.getURI();
String path = request.getPath().value();
String method = request.getMethodValue(); String method = request.getMethodValue();
HttpHeaders header = request.getHeaders(); HttpHeaders header = request.getHeaders();
log.info("------------- 开始 -------------"); 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(); String url = exchange.getRequest().getURI().getPath();
// 1、判断url是否放行 // 1、判断url是否放行
...@@ -86,7 +85,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { ...@@ -86,7 +85,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
dataBuffer.read(bytes); dataBuffer.read(bytes);
try { try {
String bodyString = new String(bytes, "utf-8"); String bodyString = new String(bytes, "utf-8");
log.info("请求参数:\n" + bodyString); log.info("\n请求参数:\n" + bodyString);
exchange.getAttributes().put("POST_BODY", bodyString); exchange.getAttributes().put("POST_BODY", bodyString);
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
e.printStackTrace(); e.printStackTrace();
...@@ -105,7 +104,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { ...@@ -105,7 +104,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
return cachedFlux; return cachedFlux;
} }
}; };
log.info("------------- 结束 用时{}s-------------", System.currentTimeMillis() - millis); log.info("------------- 结束-------------", System.currentTimeMillis() - millis);
return chain.filter(exchange.mutate().request(mutatedRequest) return chain.filter(exchange.mutate().request(mutatedRequest)
.build()); .build());
}); });
......
package com.promotion.gateway.filter; 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 lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GatewayFilterChain;
...@@ -9,7 +13,11 @@ import org.springframework.core.Ordered; ...@@ -9,7 +13,11 @@ import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils; 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.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.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator; import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -17,7 +25,11 @@ import org.springframework.web.server.ServerWebExchange; ...@@ -17,7 +25,11 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/** /**
* @author : liqiulin * @author : liqiulin
...@@ -45,18 +57,35 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered { ...@@ -45,18 +57,35 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) { if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body); Flux<? extends DataBuffer> fluxBody = Flux.from(body);
return super.writeWith(fluxBody.map(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()]; // return super.writeWith(fluxBody.map(dataBuffer -> {
dataBuffer.read(content); 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); DataBufferUtils.release(join);
//responseData就是下游系统返回的内容,可以查看修改
String responseData = new String(content, Charset.forName("UTF-8")); //打印响应日志
log.info("------------- 返回信息 -------------"); log.info("------------- 返回信息 -------------");
log.info(responseData); log.info(new String(content, StandardCharsets.UTF_8));
log.info("------------- 返回信息 -------------"); log.info("------------- 返回信息 -------------");
byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes(); return bufferFactory.wrap(content);
return bufferFactory.wrap(uppedContent);
// 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 { } else {
log.error("响应code异常:{}", getStatusCode()); log.error("响应code异常:{}", getStatusCode());
...@@ -64,6 +93,10 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered { ...@@ -64,6 +93,10 @@ public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
return super.writeWith(body); 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论