import com.live.gateway.IpUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage; import org.springframework.cloud.gateway.support.BodyInserterContext; import org.springframework.cloud.gateway.support.DefaultServerRequest; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** * @author wjc * @description */ @Component @Slf4j public class LogFilter implements GlobalFilter, GatewayFilter, Ordered { private static final String REQUESTID = "traceId"; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String bodyStr = ""; String method = request.getMethodValue(); String uri = request.getPath().toString(); //判断是否为POST请求 if (HttpMethod.POST.name().equalsIgnoreCase(method) ) { ServerRequest serverRequest = new DefaultServerRequest(exchange); // 读取请求体 if(uri.equals("/my/editorImgUrl") || uri.equals("/base/uploadImage")) { return chain.filter(exchange.mutate().build()); } Mono<String> modifiedBody = serverRequest.bodyToMono(String.class) .flatMap(body -> { //记录请求体日志 saveRequestOperLog(exchange, body); return Mono.just(body); }); BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class); HttpHeaders headers = new HttpHeaders(); headers.putAll(exchange.getRequest().getHeaders()); headers.remove(HttpHeaders.CONTENT_LENGTH); CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); return bodyInserter.insert(outputMessage, new BodyInserterContext()) .then(Mono.defer(() -> { ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator( exchange.getRequest()) { @Override public HttpHeaders getHeaders() { long contentLength = headers.getContentLength(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); if (contentLength > 0) { httpHeaders.setContentLength(contentLength); } else { httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); } return httpHeaders; } @Override public Flux<DataBuffer> getBody() { return outputMessage.getBody(); } }; return chain.filter(exchange.mutate().request(decorator).build()); })); } if (HttpMethod.GET.name().equalsIgnoreCase(method)) { bodyStr = request.getQueryParams().toString(); String nId = saveRequestOperLog(exchange, bodyStr); ServerHttpRequest userInfo = exchange.getRequest().mutate() .header(REQUESTID, nId).build(); return chain.filter(exchange.mutate().request(userInfo).build()); } return chain.filter(exchange); } /** * 保存请求日志 * * @param exchange * @param requestParameters * @return */ private String saveRequestOperLog(ServerWebExchange exchange, String requestParameters) { requestParameters = requestParameters.replaceAll("\r\n",""); ServerHttpRequest request = exchange.getRequest(); String ip = IpUtils.getIp(exchange); String uri = request.getURI().toString(); String query = request.getURI().getRawQuery(); String url = request.getPath().toString(); String method = request.getMethodValue(); log.info(String.format("\nURI: %s \nURL: %s \nMETHOD: %s \nQUERY: %s \nBODY: %s \nIP: %s", url, uri, method, query, requestParameters, ip)); return requestParameters; } @Override public int getOrder() { return 5; } }
原文:https://www.cnblogs.com/gqymy/p/14597464.html