Skip to content

配置讲解-业务过滤器的讲解

过滤器的作用

在业务服务中通过需要一些公共参数,比如分布式链路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

Java 后端面试知识库