Feign远程调用会丢失header信息,如果设置远程调用的header信息

场景:
订单模块需要查询在购物车模块的商品信息,但是在购物车模块中存在两种购物车,一个是登录的用户的购物车,一个是没有登录的零时用户的购物车,如果用户已经的登录,我们就将用户的信息放入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);
            }
        };
    }
}
posted @ 2023-04-30 13:26  just1t  阅读(184)  评论(0编辑  收藏  举报