1.为什么会丢请求头
在订单服务 远程调用 购物车服务
- 订单服务发送请求,是浏览器发起的,会自动带cookie,feign调用购物车的接口,是后端发起的,底层会创建一个新的请求,而这个请求没有任何请求头,原来请求头里的信息都会丢失
- 解决办法:feign调用远程接口时,会扫描所有的拦截器,执行apply方法,我们可以创建一个拦截器放到spring容器中,在拦截器里把原来的头都放到新创建的请求里
2.创建拦截器,把原请求的头放到新请求里
@Configuration
public class GuliFeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
RequestInterceptor requestInterceptor = 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);
}
}
}
};
return requestInterceptor;
}
}