spring cloud微服务中多线程下,子线程通过feign调用其它服务,请求头token等丢失_子线程异步调用微服务token

public static String get(String key) {
    return headerMap.get().get(key);
}

public static void set(String key, String value){
    headerMap.get().put(key,value);
}

}


在线程执行前加:  
 (1



	Enumeration<String> headerNames = servletRequest.getHeaderNames();
    while (headerNames.hasMoreElements()){
        String name = headerNames.nextElement();
        if (Objects.equals(name,"feignheader")){
            ThreadLocalUtil.set(name,servletRequest.getHeader(name));
        }
    }

或者直接获取token,在需要的地方再进行赋值。  
 (2



RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes srat = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = srat.getRequest();
ThreadLocalUtil.set(“token”, request.getHeader(“authorization”));


                
  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可能是因为FeignClient在调用时会新开一个线程,但是这个线程没有继承主线程的ThreadLocal变量,所以导致了Token丢失的问题。解决这个问题可以尝试在ThreadPoolExecutor的execute方法,手动将主线程的ThreadLocal变量传递给线程,代码示例如下: ```java ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); executor.execute(() -> { // 在线程调用FeignClient时,手动将主线程的ThreadLocal变量传递给线程 RequestContext context = RequestContext.getCurrentContext(); RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); context.set("requestAttributes", requestAttributes); try { // 调用FeignClient // ... } finally { context.unset(); } }); ``` 在FeignClient,可以通过RequestContextHolder获取ThreadLocal变量,示例如下: ```java @Component public class MyFeignClientInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { RequestContext context = RequestContext.getCurrentContext(); RequestAttributes requestAttributes = (RequestAttributes) context.get("requestAttributes"); ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = attributes.getRequest(); // 获取Token等信息 // ... // 将Token等信息添加到header requestTemplate.header("Authorization", token); } } ``` 这样就可以在线程正确地获取到主线程的ThreadLocal变量,避免了Token丢失的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值