Skip to content

使用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();
    }
}