配置讲解-业务过滤器的讲解
过滤器的作用
在业务服务中通过需要一些公共参数,比如分布式链路traceId、用户id、平台code等,按道理说这些这些参数是由Gateway网关传递而来,放到了request请求头中,业务服务需要的时候直接去request中获取就可以了。
但由于request的范围是ThreadLocal,是和线程绑定的,在使用线程池的情况下,request会丢失,所以有了线程池组件、Hystrix组件。
在线程池组件和Hystrix组件中,对公共配置中的线程绑定工具BaseParameterHolder做了适配,这个工具其实是ThreadLocal,但线程池的组件和Hystrix的组件对此工具做了增强,只要将数据放到BaseParameterHolder里,就会正常的拿到
过滤器
java
@Slf4j
public class BaseParameterFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException {
log.info("current thread doFilterInternal : {}",Thread.currentThread().getName());
String traceId = request.getHeader(TRACE_ID);
String gray = request.getHeader(GRAY_PARAMETER);
String userId = request.getHeader(USER_ID);
String code = request.getHeader(CODE);
try {
if (StringUtil.isNotEmpty(traceId)) {
BaseParameterHolder.setParameter(TRACE_ID,traceId);
MDC.put(TRACE_ID,traceId);
}
if (StringUtil.isNotEmpty(gray)) {
BaseParameterHolder.setParameter(GRAY_PARAMETER,gray);
MDC.put(GRAY_PARAMETER,gray);
}
if (StringUtil.isNotEmpty(userId)) {
BaseParameterHolder.setParameter(USER_ID,userId);
MDC.put(USER_ID,userId);
}
if (StringUtil.isNotEmpty(code)) {
BaseParameterHolder.setParameter(CODE,code);
MDC.put(CODE,code);
}
filterChain.doFilter(request, response);
}finally {
BaseParameterHolder.removeParameter(TRACE_ID);
MDC.remove(TRACE_ID);
BaseParameterHolder.removeParameter(GRAY_PARAMETER);
MDC.remove(GRAY_PARAMETER);
BaseParameterHolder.removeParameter(USER_ID);
MDC.remove(USER_ID);
BaseParameterHolder.removeParameter(CODE);
MDC.remove(CODE);
}
}
}位置
模块damai-service-component
过滤器类名com.damai.filter.BaseParameterFilter
更新: 2025-10-13 11:42:07
原文: https://www.yuque.com/u22210564/ykdrdh/slswqyfr0wnmbf3f