项目需要在网关传一个参数查询ip塞到body里面
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest serverHttpRequest = exchange.getRequest(); //验证ip String ip = getIpAddress(serverHttpRequest); return getModificationBodyMono(chain, newExchange,ip);}
private Mono getModificationBodyMono(GatewayFilterChain chain, ServerWebExchange newExchange,String ip) {
ServerRequest serverRequest = ServerRequest.create(newExchange, HandlerStrategies.withDefaults().messageReaders());
//修改body
Mono modifiedBody = serverRequest.bodyToMono(String.class).flatMap(oldBody -> {
String newBody;
//todo 这里做修改body的操作
newBody = modificationBody(oldBody,ip);
return Mono.just(newBody);
});
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(newExchange.getRequest().getHeaders());
//如果body长度有变化,那么就需要修改Content-Length,否则可能会报错
//这里为了省事直接删除
headers.remove("Content-Length");
//MyCachedBodyOutputMessage 这个类完全就是CachedBodyOutputMessage,只不过CachedBodyOutputMessage不是公共的
// CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(newExchange, headers);
MyCachedBodyOutputMessage outputMessage = new MyCachedBodyOutputMessage(newExchange, headers);
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
ServerHttpRequest decorator = this.decorate(newExchange, headers, outputMessage);
return returnMono(chain, newExchange.mutate().request(decorator).build());
}));
}
public ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers, MyCachedBodyOutputMessage outputMessage) {
return new ServerHttpRequestDecorator(exchange.getRequest()) {
public HttpHeaders getHeaders() {
long contentLength = headers.getContentLength();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.putAll(super.getHeaders());
if (contentLength > 0L) {
httpHeaders.setContentLength(contentLength);
} else {
httpHeaders.set("Transfer-Encoding", "chunked");
}
return httpHeaders;
}
public Flux<DataBuffer> getBody() {
return outputMessage.getBody();
}
};
}
private Mono<Void> returnMono(GatewayFilterChain chain,ServerWebExchange exchange){
return chain.filter(exchange).then(Mono.fromRunnable(()->{
Long startTime = exchange.getAttribute("startTime");
if (startTime != null){
long executeTime = (System.currentTimeMillis() - startTime);
log.info("耗时:{}ms" , executeTime);
log.info("状态码:{}" , Objects.requireNonNull(exchange.getResponse().getStatusCode()).value());
}
}));
}
private String modificationBody(String oldBody,String ip){
ServiceReq serviceReq = JSON.parseObject(oldBody , ServiceReq.class);
serviceReq.setIp(ip);
String jsonStr = JSON.toJSONString(serviceReq);
return jsonStr;
}