Appearance
使用traceId.md
创建拦截器文件
在 /src/main/java/com/example/xys1/interceptor/TraceIdInterceptor.java 文件中写入以下代码
java
package com.example.xys1.interceptor;
import com.example.xys1.constants.Xys1Constants;
import lombok.NonNull;
import org.slf4j.MDC;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
public class TraceIdInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(@NonNull HttpServletRequest request, HttpServletResponse response, @NonNull Object handler) {
// 1. 生成 traceId(推荐 UUID,保证唯一性;也可以使用雪花算法)
String traceId = UUID.randomUUID().toString().replace("-", "");
// 2. 放入 MDC(当前请求线程共享)
MDC.put(Xys1Constants.TRACE_ID_KEY, traceId);
// 3. (可选)将 traceId 放入响应头,方便前端获取串联链路
response.setHeader("Access-Control-Expose-Headers", Xys1Constants.TRACE_ID_KEY);
response.setHeader(Xys1Constants.TRACE_ID_KEY, traceId);
return true;
}
@Override
public void afterCompletion(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler, Exception ex) {
// 4. 请求结束后清理 MDC(关键:避免线程池复用线程导致 traceId 错乱)
MDC.remove(Xys1Constants.TRACE_ID_KEY);
}
}在项目中添加拦截器
在 /src/main/java/com/example/xys1/config/Xys1BusinessWebConfig.java 文件中写入以下代码
java
package com.example.xys1.config;
import com.example.xys1.interceptor.TraceIdInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class Xys1BusinessWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(traceIdInterceptor()).addPathPatterns("/**");
}
@Bean
public TraceIdInterceptor traceIdInterceptor() {
return new TraceIdInterceptor();
}
}