Feign远程调用丢失请求头问题
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方法");
}
};
}
}
问题又来了,这个只在单线程下有效,如果我们用了异步的方式,则会出现上下文丢失
解决办法: 1.拿到原来的请求:
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
2.在需要共享数据的线程后面加上:
RequestContextHolder.setRequestAttributes(requestAttributes)