【发布时间】:2023-04-01 05:20:02
【问题描述】:
使用 Spring web 一个简单的OncePerRequestFilter(见下文)可以为请求的跨度维护一个请求 ID。
将生成的请求 ID 存储在请求属性中,将其添加到日志记录 MDC,并在响应标头中返回。
我知道响应式 webflux 堆栈是完全不同的,那么应该如何解决这个问题?
我找到了https://github.com/spring-projects/spring-framework/issues/20239,但不清楚现在支持与否。
@Component
public class RequestIdFilter extends OncePerRequestFilter implements Ordered {
private static final String MDC_KEY = "requestId";
private static final String REQUEST_ATTRIBUTE_NAME = "requestId";
private static final String RESPONSE_HEADER_NAME = "X-Request-Id";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
var requestId = UUID.randomUUID().toString();
MDC.put(MDC_KEY, requestId);
request.setAttribute(REQUEST_ATTRIBUTE_NAME, requestId);
response.setHeader(RESPONSE_HEADER_NAME, requestId);
try {
filterChain.doFilter(request, response);
} finally {
MDC.remove(MDC_KEY);
}
}
@Override
public int getOrder() {
return requestIdProperties.getServerFilterOrder();
}
}
【问题讨论】:
标签: spring spring-boot spring-webflux