diff --git a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/filter/TraceIdFilter.java b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/filter/TraceIdFilter.java index 69a54aa0..357bbab3 100644 --- a/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/filter/TraceIdFilter.java +++ b/nflg-mobilebroken-starter/src/main/java/com/nflg/mobilebroken/starter/filter/TraceIdFilter.java @@ -18,6 +18,8 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -66,24 +68,63 @@ public class TraceIdFilter extends OncePerRequestFilter { private String getResponseBody(ContentCachingResponseWrapper response) { if (shouldSkipBodyLogging(response.getContentType())){ - return "[不记录]"+response.getContentType(); + return "不记录"+response.getContentType(); } byte[] buf = response.getContentAsByteArray(); if (buf.length > 0) { return new String(buf, StandardCharsets.UTF_8); } - return "[无数据]"; + return "无数据"; } private void logRequest(ContentCachingRequestWrapper request) { log.debug("【HTTP Request】"); - log.debug("URL : {}", request.getRequestURL().toString()); + log.debug("URL : {}", request.getRequestURI() + (StrUtil.isBlank(request.getQueryString()) ? "" : "?" + request.getQueryString())); + log.debug("HOST : {}", getHost(request)); log.debug("METHOD : {}", request.getMethod()); log.debug("HEADERS: {}", getHeadersAsString(request)); log.debug("USER : {}", getUserInfo(request)); log.debug("BODY : {}", getRequestBody(request)); } + private String getHost(HttpServletRequest request) { + String forwardedHost = request.getHeader("Host"); + if (forwardedHost != null && !forwardedHost.isEmpty()) { + return forwardedHost.split(",")[0].trim(); + } + String forwardedHeader = request.getHeader("Forwarded"); + if (forwardedHeader != null) { + String host = parseForwardedHeader(forwardedHeader, "host"); + if (host != null) return host; + } + return getHostFromRequestURL(request); + } + + private String getHostFromRequestURL(HttpServletRequest request) { + StringBuffer requestURL = request.getRequestURL(); + String urlString = requestURL.toString(); + + // 提取主机部分 + try { + URI uri = new URI(urlString); + return uri.getAuthority(); // 返回格式: "example.com:8080" + } catch (URISyntaxException e) { + return "未知"; + } + } + + private String parseForwardedHeader(String header, String key) { + String[] parts = header.split(";"); + for (String part : parts) { + part = part.trim(); + if (part.startsWith(key + "=")) { + String value = part.substring(key.length() + 1); + return value.replace("\"", ""); + } + } + return null; + } + private String getUserInfo(ContentCachingRequestWrapper request) { String token=request.getHeader("authorization"); if (StrUtil.isBlank(token)){ @@ -113,7 +154,7 @@ public class TraceIdFilter extends OncePerRequestFilter { if (buf.length > 0) { return new String(buf, StandardCharsets.UTF_8).replaceAll("\\s", ""); } - return "[无数据]"; + return "无数据"; } private String getHeadersAsString(HttpServletRequest request) {