场景:
订单模块需要查询在购物车模块的商品信息,但是在购物车模块中存在两种购物车,一个是登录的用户的购物车,一个是没有登录的零时用户的购物车,如果用户已经的登录,我们就将用户的信息放入session中,我们通过创建一个拦截器进行判断用户是否进行登录,如果登陆了,就将用户的信息放入ThreadLocal中。
当前,我们需要在订单模块中使用远程调用,调用cart模块的接口,由于我们使用feign,没有进行任何操作的时候,它封装的请求头为空,并且购物车在进行查询的时候使用的是自己模块中ThreadLocal对象中的用户信息,就会产生一个问题:即使在用户登录之后,发送订单请求,在购物车模块任然获取不了用户的信息。
想要进行解决也是很简单的,就需要将原始的请求中的请求头一同设置到feign构造的新的请求中就好了。
如何进行设置?
通过源码分析:
图一
图二
从图一中可以看出,在构造请求的时候是通过调用Request request = targetRequest(template);
这段代码进行创建请求,也就是说,我们可以在该方法中进行自定义我们的请求。
从图二中可以看出,自定义我们的请求只需要创建RequestInterceptor对象,在该对象中的apple方法中进行设置构造请求的参数即可。
实例:在feign构造的请求中同步原来请求的cookie信息
@Configuration
public class MyFeignConfiguration {
@Bean
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
/**
* 向远程调用的新请求中设置cookie
* @param template 表示feign构造的新请求
*/
@Override
public void apply(RequestTemplate template) {
//我们可以通过RequestContextHolder获取该次请求的请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//获取请求头
HttpServletRequest request = attributes.getRequest();
// cookie
String cookie = request.getHeader("Cookie");
template.header("Cookie",cookie);
}
};
}
}
标签:调用,请求,用户,购物车,header,cookie,模块,远程
From: https://www.cnblogs.com/just1t/p/17365176.html