|
|
@ -0,0 +1,47 @@ |
|
|
|
|
|
package com.inspect.nvr.config; |
|
|
|
|
|
|
|
|
|
|
|
import org.slf4j.MDC; |
|
|
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
import org.springframework.web.filter.OncePerRequestFilter; |
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 用于在每个请求中生成或传递traceId,方便日志追踪 |
|
|
|
|
|
*/ |
|
|
|
|
|
@Component |
|
|
|
|
|
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 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(MDC_KEY, traceId); |
|
|
|
|
|
// 4.可响应 header 给下游 |
|
|
|
|
|
response.setHeader(TRACE_ID_HEADER, traceId); |
|
|
|
|
|
// 5.继续处理请求 |
|
|
|
|
|
filterChain.doFilter(request, response); |
|
|
|
|
|
} finally { |
|
|
|
|
|
// 6.处理完成,清除MDC中的traceId(避免线程复用污染) |
|
|
|
|
|
MDC.clear(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String generateTraceId() { |
|
|
|
|
|
return UUID.randomUUID().toString().replace("-", ""); |
|
|
|
|
|
} |
|
|
|
|
|
} |