使用 spring 启动拦截对 get/add 关联 ID 的请求和响应
Intercept requests and responses to get/add correlation id with spring boot
我正在开发一个微服务,我第一次尝试实现关联 ID。基本上我有一个控制器,我想拦截任何请求以从请求 header 获取相关 ID 或创建一个,如果 header 不存在。我还想将关联 ID 添加到响应 header,并将其保存在 SLF4J
MDC 中以用于记录目的。
目前我有:
@Slf4j
@Component
public class CorrelationIdInterceptor implements HandlerInterceptor {
private final static String CORRELATION_ID_NAME = "correlation-id";
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
final String correlationId = getOrGenerateCorrelationId(request);
MDC.put(CORRELATION_ID_NAME, correlationId);
log.info("New correlation id: {}", correlationId);
return true;
}
@Override
public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, Object handler, Exception ex) throws Exception {
MDC.remove(CORRELATION_ID_NAME);
}
private String getOrGenerateCorrelationId(final HttpServletRequest request) {
final String correlationId = request.getHeaders(CORRELATION_ID_NAME).toString();
if(correlationId.isEmpty()) {
return UUID.randomUUID().toString();
}
return correlationId;
}
}
以及将我的自定义拦截器指定为默认拦截器的 Web 配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(new CorrelationIdInterceptor());
}
}
行 log.info("New correlation id: {}", correlationId);
从未被调用,因为我在控制台中看不到它。我也尝试过使用 GlobalFilter 方法但无法成功。我究竟做错了什么?我怎样才能完成相关 ID 拦截器并将 ID 记录在我所有的 Slf4j
日志中?
您可以使用 Spring Cloud Sleuth 内置的 traceID 来。
https://www.baeldung.com/spring-cloud-sleuth-single-application
您确定 class 位于正在扫描注释的包中吗?看起来您的配置已完成
我正在开发一个微服务,我第一次尝试实现关联 ID。基本上我有一个控制器,我想拦截任何请求以从请求 header 获取相关 ID 或创建一个,如果 header 不存在。我还想将关联 ID 添加到响应 header,并将其保存在 SLF4J
MDC 中以用于记录目的。
目前我有:
@Slf4j
@Component
public class CorrelationIdInterceptor implements HandlerInterceptor {
private final static String CORRELATION_ID_NAME = "correlation-id";
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
final String correlationId = getOrGenerateCorrelationId(request);
MDC.put(CORRELATION_ID_NAME, correlationId);
log.info("New correlation id: {}", correlationId);
return true;
}
@Override
public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, Object handler, Exception ex) throws Exception {
MDC.remove(CORRELATION_ID_NAME);
}
private String getOrGenerateCorrelationId(final HttpServletRequest request) {
final String correlationId = request.getHeaders(CORRELATION_ID_NAME).toString();
if(correlationId.isEmpty()) {
return UUID.randomUUID().toString();
}
return correlationId;
}
}
以及将我的自定义拦截器指定为默认拦截器的 Web 配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(new CorrelationIdInterceptor());
}
}
行 log.info("New correlation id: {}", correlationId);
从未被调用,因为我在控制台中看不到它。我也尝试过使用 GlobalFilter 方法但无法成功。我究竟做错了什么?我怎样才能完成相关 ID 拦截器并将 ID 记录在我所有的 Slf4j
日志中?
您可以使用 Spring Cloud Sleuth 内置的 traceID 来。 https://www.baeldung.com/spring-cloud-sleuth-single-application
您确定 class 位于正在扫描注释的包中吗?看起来您的配置已完成