Feign远程调用丢失请求头问题

697 阅读1分钟

Feign远程调用丢失请求头问题

截屏2020-11-21 17.00.34

RequestInterceptor配置

RequestContextHolder 底层是一个Thread Local

@Configuration
public class GrainmallFeginConfig {

    @Bean("requestInterceptor")
    public RequestInterceptor  requestInterceptor(){
       return new RequestInterceptor(){

           @Override
           public void apply(RequestTemplate template) {

               //使用RequestContextHolder拿到刚进来的这个请求
               ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
               HttpServletRequest request = requestAttributes.getRequest();  //老请求(带cookie) ,如果不同步的话fegin会自己创建一个默认的新请求,里面没有cookie
               //同步请求头数据  Cookie
              if (request!=null) {
               String cookie = request.getHeader("Cookie");
               //给新请求同步了老请求的cookie
               template.header("Cookie",cookie);
              }
               System.out.println("feign远程之前先执行RequestInterceptor.apply方法");
           }
       };
    }

}

问题又来了,这个只在单线程下有效,如果我们用了异步的方式,则会出现上下文丢失

截屏2020-11-21 18.30.31

解决办法: 1.拿到原来的请求:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

2.在需要共享数据的线程后面加上:

RequestContextHolder.setRequestAttributes(requestAttributes)