Feign远程调用丢失请求头的问题
解决方法:加上一个feing远程调用的请求拦截器,在拦截器中给template加上一个客户端传过来的cookie,和客户端发送过来的请求的请求头进行同步。
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
//1、使用RequestContextHolder拿到刚进来的请求数据
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
//老请求
HttpServletRequest request = requestAttributes.getRequest();
if (request != null) {
//2、同步请求头的数据(主要是cookie)
String cookie = request.getHeader("Cookie");
//把老请求的cookie值放到新请求上来,进行一个同步
template.header("Cookie", cookie);
}
}
}
};
}
Feign异步调用丢失请求头的问题
解决方法:在执行异步任务之前先获取请求信息,等开始异步任务时再在每一个线程里面放入之前获取到的请求信息
//TODO :获取当前线程请求头信息(解决Feign异步调用丢失请求头问题)
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//开启第一个异步任务
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {
//每一个线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(requestAttributes);
//执行任务
xxxxxxxxxxxxxxxxxxx;
}, threadPoolExecutor);