From eed1f52fe5157aa640ceee2f897ddb68bde33c63 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 11 四月 2026 02:43:35 +0800
Subject: [PATCH] 修改合规监管代码
---
xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/log/RequestResponseLoggingFilter.java | 315 +++++++++++++++++++++++-----------------------------
1 files changed, 139 insertions(+), 176 deletions(-)
diff --git a/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/log/RequestResponseLoggingFilter.java b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/log/RequestResponseLoggingFilter.java
index f70057c..5c46133 100644
--- a/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/log/RequestResponseLoggingFilter.java
+++ b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/log/RequestResponseLoggingFilter.java
@@ -1,176 +1,139 @@
-//package com.xiaopeng.trafficControl.config.log;
-//
-//import com.xiaopeng.common.log.config.LogHeaderProperties;
-//import lombok.extern.slf4j.Slf4j;
-//import org.slf4j.MDC;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.core.Ordered;
-//import org.springframework.core.annotation.Order;
-//import org.springframework.http.MediaType;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.filter.OncePerRequestFilter;
-//import org.springframework.web.util.ContentCachingRequestWrapper;
-//import org.springframework.web.util.ContentCachingResponseWrapper;
-//
-//import javax.servlet.FilterChain;
-//import javax.servlet.ServletException;
-//import javax.servlet.http.HttpServletRequest;
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.IOException;
-//import java.nio.charset.StandardCharsets;
-//import java.util.*;
-//
-///**
-// * 请求/响应日志过滤器
-// * 打印:traceId、method、uri、queryString、请求体、响应状态、耗时、响应体
-// */
-//@Slf4j
-//@Component
-//@Order(Ordered.HIGHEST_PRECEDENCE + 10)
-//public class RequestResponseLoggingFilter extends OncePerRequestFilter {
-//
-// @Autowired
-// private LogHeaderProperties logHeaderProperties;
-//
-// /** 不打印 body 的路径前缀(健康检查、actuator 等) */
-// private static final Set<String> EXCLUDE_PATHS = new HashSet<>(Arrays.asList(
-// "/actuator", "/healthcheck", "/health", "/prometheus"
-// ));
-//
-// /** 只对这些 Content-Type 打印 body(避免打印二进制流) */
-// private static final Set<String> LOGGABLE_CONTENT_TYPES = new HashSet<>(Arrays.asList(
-// MediaType.APPLICATION_JSON_VALUE,
-// MediaType.APPLICATION_JSON_UTF8_VALUE,
-// MediaType.TEXT_PLAIN_VALUE,
-// MediaType.TEXT_XML_VALUE,
-// MediaType.APPLICATION_XML_VALUE,
-// "application/x-www-form-urlencoded"
-// ));
-//
-// private static final int MAX_BODY_LENGTH = 2000;
-//
-// @Override
-// protected boolean shouldNotFilter(HttpServletRequest request) {
-// String uri = request.getRequestURI();
-// return EXCLUDE_PATHS.stream().anyMatch(uri::startsWith);
-// }
-//
-// @Override
-// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
-// FilterChain chain) throws ServletException, IOException {
-// // 初始化 MDC(Filter 先于 Interceptor 执行,在此统一设置)
-// String traceId = request.getHeader("X-Trace-Id");
-// if (traceId == null || traceId.isEmpty()) {
-// traceId = UUID.randomUUID().toString().replace("-", "");
-// }
-// MDC.put("traceId", traceId);
-// MDC.put("clientIp", getClientIp(request));
-// MDC.put("requestUri", request.getRequestURI());
-// response.setHeader("X-Trace-Id", traceId);
-//
-// ContentCachingRequestWrapper reqWrapper = new ContentCachingRequestWrapper(request);
-// ContentCachingResponseWrapper respWrapper = new ContentCachingResponseWrapper(response);
-//
-// long start = System.currentTimeMillis();
-// try {
-// chain.doFilter(reqWrapper, respWrapper);
-// } finally {
-// long cost = System.currentTimeMillis() - start;
-// logRequest(reqWrapper);
-// logResponse(respWrapper, cost);
-// // 必须把响应体写回,否则客户端收不到数据
-// respWrapper.copyBodyToResponse();
-// MDC.clear();
-// }
-// }
-//
-// private String getClientIp(HttpServletRequest request) {
-// String ip = request.getHeader("X-Forwarded-For");
-// if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
-// return ip.split(",")[0].trim();
-// }
-// ip = request.getHeader("X-Real-IP");
-// if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
-// return ip;
-// }
-// return request.getRemoteAddr();
-// }
-//
-// private void logRequest(ContentCachingRequestWrapper request) {
-// String traceId = MDC.get("traceId");
-// String uri = request.getRequestURI();
-// String query = request.getQueryString();
-// String method = request.getMethod();
-// String body = extractBody(request.getContentAsByteArray(), request.getContentType());
-//
-// if (logHeaderProperties.isEnabled()) {
-// String headers = extractHeaders(request);
-// log.info(">>> [{}] {} {}{} | headers={} | body={}",
-// traceId, method, uri,
-// query != null ? "?" + query : "",
-// headers, body);
-// } else {
-// log.info(">>> [{}] {} {}{} | body={}",
-// traceId, method, uri,
-// query != null ? "?" + query : "",
-// body);
-// }
-// }
-//
-// private String extractHeaders(HttpServletRequest request) {
-// List<String> names = logHeaderProperties.getNames();
-// StringBuilder sb = new StringBuilder("{");
-// boolean first = true;
-// if (names != null && !names.isEmpty()) {
-// // 只打印配置的请求头
-// for (String name : names) {
-// String value = request.getHeader(name);
-// if (value != null) {
-// if (!first) sb.append(", ");
-// first = false;
-// sb.append(name).append("=").append(value);
-// }
-// }
-// } else {
-// // 未配置则打印全部请求头
-// Enumeration<String> headerNames = request.getHeaderNames();
-// while (headerNames != null && headerNames.hasMoreElements()) {
-// String name = headerNames.nextElement();
-// String value = request.getHeader(name);
-// if (!first) sb.append(", ");
-// first = false;
-// sb.append(name).append("=").append(value);
-// }
-// }
-// return sb.append("}").toString();
-// }
-//
-// private void logResponse(ContentCachingResponseWrapper response, long cost) {
-// String traceId = MDC.get("traceId");
-// int status = response.getStatus();
-// String body = extractBody(response.getContentAsByteArray(), response.getContentType());
-//
-// log.info("<<< [{}] status={} cost={}ms | body={}",
-// traceId, status, cost, body);
-// }
-//
-// private String extractBody(byte[] bodyBytes, String contentType) {
-// if (bodyBytes == null || bodyBytes.length == 0) {
-// return "";
-// }
-// if (!isLoggableContentType(contentType)) {
-// return "[binary, " + bodyBytes.length + " bytes]";
-// }
-// String body = new String(bodyBytes, StandardCharsets.UTF_8);
-// if (body.length() > MAX_BODY_LENGTH) {
-// body = body.substring(0, MAX_BODY_LENGTH) + "...(truncated)";
-// }
-// return body;
-// }
-//
-// private boolean isLoggableContentType(String contentType) {
-// if (contentType == null) return true;
-// String ct = contentType.toLowerCase();
-// return LOGGABLE_CONTENT_TYPES.stream().anyMatch(ct::contains);
-// }
-//}
+package com.xiaopeng.trafficControl.config.log;
+
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.util.ContentCachingRequestWrapper;
+import org.springframework.web.util.ContentCachingResponseWrapper;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 请求/响应日志过滤器
+ * 打印:traceId、method、uri、queryString、请求体、响应状态、耗时、响应体
+ */
+@Slf4j
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE + 10)
+public class RequestResponseLoggingFilter extends OncePerRequestFilter {
+
+ /** 不打印 body 的路径前缀(健康检查、actuator 等) */
+ private static final Set<String> EXCLUDE_PATHS = new HashSet<>(Arrays.asList(
+ "/actuator", "/healthcheck", "/health", "/prometheus"
+ ));
+
+ /** 只对这些 Content-Type 打印 body(避免打印二进制流) */
+ private static final Set<String> LOGGABLE_CONTENT_TYPES = new HashSet<>(Arrays.asList(
+ MediaType.APPLICATION_JSON_VALUE,
+ MediaType.APPLICATION_JSON_UTF8_VALUE,
+ MediaType.TEXT_PLAIN_VALUE,
+ MediaType.TEXT_XML_VALUE,
+ MediaType.APPLICATION_XML_VALUE,
+ "application/x-www-form-urlencoded"
+ ));
+
+ private static final int MAX_BODY_LENGTH = 2000;
+
+ @Override
+ protected boolean shouldNotFilter(HttpServletRequest request) {
+ String uri = request.getRequestURI();
+ return EXCLUDE_PATHS.stream().anyMatch(uri::startsWith);
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
+ FilterChain chain) throws ServletException, IOException {
+ // 初始化 MDC(Filter 先于 Interceptor 执行,在此统一设置)
+ String traceId = request.getHeader("X-Trace-Id");
+ if (traceId == null || traceId.isEmpty()) {
+ traceId = java.util.UUID.randomUUID().toString().replace("-", "");
+ }
+ MDC.put("traceId", traceId);
+ MDC.put("clientIp", getClientIp(request));
+ MDC.put("requestUri", request.getRequestURI());
+ response.setHeader("X-Trace-Id", traceId);
+
+ ContentCachingRequestWrapper reqWrapper = new ContentCachingRequestWrapper(request);
+ ContentCachingResponseWrapper respWrapper = new ContentCachingResponseWrapper(response);
+
+ long start = System.currentTimeMillis();
+ try {
+ chain.doFilter(reqWrapper, respWrapper);
+ } finally {
+ long cost = System.currentTimeMillis() - start;
+ logRequest(reqWrapper);
+ logResponse(respWrapper, cost);
+ // 必须把响应体写回,否则客户端收不到数据
+ respWrapper.copyBodyToResponse();
+ MDC.clear();
+ }
+ }
+
+ private String getClientIp(HttpServletRequest request) {
+ String ip = request.getHeader("X-Forwarded-For");
+ if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
+ return ip.split(",")[0].trim();
+ }
+ ip = request.getHeader("X-Real-IP");
+ if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
+ return ip;
+ }
+ return request.getRemoteAddr();
+ }
+
+ private void logRequest(ContentCachingRequestWrapper request) {
+ String traceId = MDC.get("traceId");
+ String uri = request.getRequestURI();
+ String query = request.getQueryString();
+ String method = request.getMethod();
+ String body = extractBody(request.getContentAsByteArray(), request.getContentType());
+
+ log.info(">>> [{}] {} {}{} | body={}",
+ traceId,
+ method,
+ uri,
+ query != null ? "?" + query : "",
+ body);
+ }
+
+ private void logResponse(ContentCachingResponseWrapper response, long cost) {
+ String traceId = MDC.get("traceId");
+ int status = response.getStatus();
+ String body = extractBody(response.getContentAsByteArray(), response.getContentType());
+
+ log.info("<<< [{}] status={} cost={}ms | body={}",
+ traceId, status, cost, body);
+ }
+
+ private String extractBody(byte[] bodyBytes, String contentType) {
+ if (bodyBytes == null || bodyBytes.length == 0) {
+ return "";
+ }
+ if (!isLoggableContentType(contentType)) {
+ return "[binary, " + bodyBytes.length + " bytes]";
+ }
+ String body = new String(bodyBytes, StandardCharsets.UTF_8);
+ if (body.length() > MAX_BODY_LENGTH) {
+ body = body.substring(0, MAX_BODY_LENGTH) + "...(truncated)";
+ }
+ return body;
+ }
+
+ private boolean isLoggableContentType(String contentType) {
+ if (contentType == null) return true;
+ String ct = contentType.toLowerCase();
+ return LOGGABLE_CONTENT_TYPES.stream().anyMatch(ct::contains);
+ }
+}
--
Gitblit v1.7.1