gateway:完善 AccessLogFilter 的注释

This commit is contained in:
YunaiV 2022-06-08 00:04:02 +08:00
parent 88352fe065
commit b2fc171609

View File

@ -10,6 +10,7 @@ import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage; import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage;
import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory;
import org.springframework.cloud.gateway.support.BodyInserterContext; import org.springframework.cloud.gateway.support.BodyInserterContext;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
@ -20,6 +21,7 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpOutputMessage;
import org.springframework.http.codec.HttpMessageReader; import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
@ -50,7 +52,6 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
} }
@Override @Override
@SuppressWarnings("unchecked")
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// Request 中可以直接获取到的参数设置到网关日志 // Request 中可以直接获取到的参数设置到网关日志
ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest request = exchange.getRequest();
@ -82,31 +83,28 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
} }
/** /**
* 解决 request body 只能读取一次问题 * 参考 {@link ModifyRequestBodyGatewayFilterFactory} 实现
* 参考: org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory *
* @param exchange * 差别主要在于使用 modifiedBody 来读取 Request Body 数据
* @param chain
* @param gatewayLog
* @return
*/ */
@SuppressWarnings("unchecked") private Mono<Void> filterWithRequestBody(ServerWebExchange exchange, GatewayFilterChain chain, GatewayLog gatewayLog) {
private Mono filterWithRequestBody(ServerWebExchange exchange, GatewayFilterChain chain, GatewayLog gatewayLog) { // 设置 Request Body 读取时设置到网关日志
ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders); ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(body -> { Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(body -> {
gatewayLog.setRequestBody(body); gatewayLog.setRequestBody(body);
return Mono.just(body); return Mono.just(body);
}); });
// 通过 BodyInserter 插入 body(支持修改body), 避免 request body 只能获取一次 // 创建 BodyInserter 对象
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class); BodyInserter<Mono<String>, ReactiveHttpOutputMessage> bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
// 创建 CachedBodyOutputMessage 对象
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.putAll(exchange.getRequest().getHeaders()); headers.putAll(exchange.getRequest().getHeaders());
// the new content type will be computed by bodyInserter // the new content type will be computed by bodyInserter
// and then set in the request decorator // and then set in the request decorator
headers.remove(HttpHeaders.CONTENT_LENGTH); headers.remove(HttpHeaders.CONTENT_LENGTH); // 移除
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
// 通过 BodyInserter Request Body 写入到 CachedBodyOutputMessage
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
// 包装 Request用于缓存 Request Body // 包装 Request用于缓存 Request Body
ServerHttpRequest decoratedRequest = requestDecorate(exchange, headers, outputMessage); ServerHttpRequest decoratedRequest = requestDecorate(exchange, headers, outputMessage);
@ -120,8 +118,7 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
/** /**
* 打印日志 * 打印日志
* @author javadaily *
* @date 2021/3/24 14:53
* @param gatewayLog 网关日志 * @param gatewayLog 网关日志
*/ */
private void writeAccessLog(GatewayLog gatewayLog) { private void writeAccessLog(GatewayLog gatewayLog) {