From 5c9eef3d538adb1605d3aa74012eda9866aaa8bd Mon Sep 17 00:00:00 2001 From: yinhuaiwei Date: Wed, 17 Dec 2025 10:36:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=97=A5=E5=BF=97=E5=A2=9EtraceId?= =?UTF-8?q?=EF=BC=8C=E8=BF=BD=E8=B8=AA=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=93=BE=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/inspect/nvr/config/TraceIdFilter.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/inspect/nvr/config/TraceIdFilter.java b/src/main/java/com/inspect/nvr/config/TraceIdFilter.java index 5ea5f9a..d8a7187 100644 --- a/src/main/java/com/inspect/nvr/config/TraceIdFilter.java +++ b/src/main/java/com/inspect/nvr/config/TraceIdFilter.java @@ -2,9 +2,12 @@ package com.inspect.nvr.config; import org.slf4j.MDC; import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; -import javax.servlet.*; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.UUID; @@ -12,26 +15,28 @@ import java.util.UUID; * 用于在每个请求中生成或传递traceId,方便日志追踪 */ @Component -public class TraceIdFilter implements Filter { - private static final String TRACE_ID = "traceId"; +public class TraceIdFilter extends OncePerRequestFilter { + private static final String TRACE_ID_HEADER = "X-Trace-Id"; // 可从 header 传入,支持链路传递 + private static final String MDC_KEY = "traceId"; @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; - // 1.优先从请求头中获取traceId - String traceId = httpServletRequest.getHeader(TRACE_ID); - // 2.若请求头中没有traceId,则生成新的traceId - if (traceId == null || traceId.isEmpty()) { - traceId = generateTraceId(); - } - + public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { try { + // 1.优先从请求头中获取traceId + String traceId = request.getHeader(TRACE_ID_HEADER); + // 2.若请求头中没有traceId,则生成新的traceId + if (traceId == null || traceId.isEmpty()) { + traceId = generateTraceId(); + } // 3.将traceId放入MDC中 - MDC.put(TRACE_ID, traceId); - // 4.继续处理请求 - filterChain.doFilter(servletRequest, servletResponse); + MDC.put(MDC_KEY, traceId); + // 4.可响应 header 给下游 + response.setHeader(TRACE_ID_HEADER, traceId); + // 5.继续处理请求 + filterChain.doFilter(request, response); } finally { - // 5.处理完成,清除MDC中的traceId(避免线程复用污染) + // 6.处理完成,清除MDC中的traceId(避免线程复用污染) MDC.clear(); } }