com.biz.trace.interceptor.TraceInterceptor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biz-all Show documentation
Show all versions of biz-all Show documentation
BizX 是一个灵活而高效的业务开发框架, 其中也有很多为业务开发所需要的工具类的提供。
The newest version!
package com.biz.trace.interceptor;
import com.biz.common.bean.BizXBeanUtils;
import com.biz.common.utils.Common;
import com.biz.trace.id.TraceIdService;
import com.biz.trace.store.TraceStoreService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 日志追踪拦截器。
*
* 该拦截器实现了 {@link HandlerInterceptor} 接口,用于在处理每个 HTTP 请求时生成并管理日志追踪Id。
*
* 拦截器在请求进入时首先检查请求头中是否包含特定的追踪Id(通过 {@code X-TRACE-ID-HEADER} 传递)。
* 如果请求头中没有该追踪Id,则通过 {@link TraceIdService} 生成一个新的追踪Id,并将其存储在 {@link TraceStoreService} 中,
* 便于日志系统使用。请求完成后,追踪Id会被移除,以确保线程安全和资源清理。
*
* @author francis
* @see HandlerInterceptor
* @see TraceStoreService
* @see BizXBeanUtils
* @since 1.0.1
**/
@Slf4j
public class TraceInterceptor implements HandlerInterceptor, Ordered {
/**
* 用于在请求头中传递追踪Id的键。
*/
private static final String TRACE_ID_KEY = "X-TRACE-ID-HEADER";
/**
* 用于存储和获取追踪Id的服务。
*/
private final TraceStoreService traceStoreService;
/**
* 用于生成日志追踪Id的服务。
*/
private final TraceIdService traceIdService;
/**
* 构造函数,允许通过参数直接注入 {@link TraceStoreService} 实例。
*
* @param traceStoreService 注入的 {@link TraceStoreService} 实例
*/
public TraceInterceptor(TraceStoreService traceStoreService, TraceIdService traceIdService) {
this.traceStoreService = traceStoreService;
this.traceIdService = traceIdService;
}
/**
* 在请求处理之前执行,将生成的追踪Id存入 {@link TraceStoreService} 中。
*
* 如果请求头中包含 {@code X-TRACE-ID-HEADER},则直接使用该值作为追踪Id。
* 否则,生成一个新的追踪Id,并存入 {@link TraceStoreService} 中。
*
* @param request 当前的 HTTP 请求
* @param response 当前的 HTTP 响应
* @param handler 被调用的处理器
* @return 是否继续处理请求
* @throws Exception 如果发生任何错误
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceIdHeader = request.getHeader(TRACE_ID_KEY);
if (Common.isBlank(traceIdHeader)) {
traceStoreService.put(traceIdService.getId());
} else {
traceStoreService.put(traceIdHeader);
}
return true;
}
/**
* 在请求处理之后但在视图渲染之前执行。本方法未实现任何逻辑,但保留了方法体以便扩展。
*
* @param request 当前的 HTTP 请求
* @param response 当前的 HTTP 响应
* @param handler 被调用的处理器
* @param modelAndView 请求处理后的视图
* @throws Exception 如果发生任何错误
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 在请求完成后执行,清理 {@link TraceStoreService} 中的追踪Id。
*
* @param request 当前的 HTTP 请求
* @param response 当前的 HTTP 响应
* @param handler 被调用的处理器
* @param ex 请求处理过程中发生的异常,如果有则传入
* @throws Exception 如果发生任何错误
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
traceStoreService.remove();
}
/**
* 获取拦截器的顺序。
*
* 该拦截器的顺序被设置为99,以确保其在大多数其他拦截器之后执行。
*
* @return 拦截器的顺序值
*/
@Override
public int getOrder() {
return 99;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy