Feign远程调用丢失请求头问题处理

在处理Feign远程调用时遇到请求头丢失的问题,原因是Feign的拦截器在生成Request对象时不包含原始请求的头部信息。通过深入分析Feign的执行流程,发现在ReflectiveFeign类的invoke方法和SynchronousMethodHandler类的invoke方法中,请求头信息未被正确传递。解决方法是在Feign拦截器中重写apply(RequestTemplate requestTemplate)方法,利用RequestContextHolder获取原始请求的Cookie数据,并将其添加到requestTemplate的头部,确保远程调用时请求头信息得以保留,从而解决了登录拦截器因无法获取cookie导致的远程调用失败问题。
摘要由CSDN通过智能技术生成

在浏览器发送一个Q请求,请求中原包含请求头headers信息,controller某个A方法接收到Q请求并调用某个B方法。B方法中有Feign远程调用,在执行Feign远程调用其他服务时,会丢失掉原来请求中的请求头信息。

Feign远程调用底层是发送Http请求,而发送请求时会经过Feign的拦截器。Request request = targetRequest(template);template包含请求地址请求头但是请求头没有数据,targetRequest (template)方法会经过Feign的拦截器 返回一个Request对象,然后再执行http请求获取数据。

详细:在B方法Feign远程调用时,会触发ReflectiveFeign类下 Object invoke(Object proxy, Method method, Object[] args)方法,该方法的参数包含服务名称,请求方式(GET)等等,但是请求头信息为空。此方法会调用 dispatch.get(method).invoke(args)方法;来到SynchronousMethodHandler类下的 Object invoke(Object[] argv)方法;Object invoke(Object[] argv)方法会再调用executeAndDecode(template, options)方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值