feign默认构造的template中header没有数据
package com.kun.order.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @author zhoukun 86547462@qq.com
* @version 1.0
* @date 2020/12/30 15:23
*/
@Configuration
public class FeignConfig {
@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)
//把老请求的cookie值放到新请求上来,进行一个同步
String cookie = request.getHeader("Cookie");
template.header("Cookie", cookie);
}
}
}
};
}
}
如果是在异步方法中调用feign会出现HttpServletRequest request = requestAttributes.getRequest()
为null
的情况,需要先获取主线程的request
,再设置到子线程
@Override
public OrderClearingFormVo getClearForm() throws ExecutionException, InterruptedException {
OrderClearingFormVo formVo=new OrderClearingFormVo();
//获取当前用户信息
MemberEntityTo memberEntityTo = loginLocal.get();
// 由于开启了新的线程,不能获取当前线程的session,需要设置到子线程中
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {
// 设置子线程的request
RequestContextHolder.setRequestAttributes(requestAttributes);
//获取当前用户的收货地址信息
List<MemberAddressVo> memberAddressVos = memberFeignService.addressByMemberId(memberEntityTo.getId());
formVo.setAddress(memberAddressVos);
}, executor);
CompletableFuture<Void> cartFuture = CompletableFuture.runAsync(()->{
// 设置子线程的request
RequestContextHolder.setRequestAttributes(requestAttributes);
//获取购物车数据列表
List<CartItemVo> cartItemVos = cartFeignService.currentItem();
formVo.setItems(cartItemVos);
},executor);
//查询用户积分
Integer integration = memberEntityTo.getIntegration();
formVo.setIntegration(integration);
//异步任务同时执行完毕
CompletableFuture.allOf(addressFuture,cartFuture).get();
log.info("====>"+formVo.toString());
//防重复令牌
return formVo;
}