Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递

微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的拦截,把用户信息存放到ThreadLocal供接口使用。
在这里插入图片描述

feign远程调用的时候,有时候也需要把消费者端的用户信息传递到服务提供者端,否则可能因为没有用户信息而无法调用接口。feign调用并不会走网关,是由服务消费者直接去调用服务提供者,在消费者端已经有userId的前提下,只需要把userId放到Http的请求头中就可以继续复用微服务中HandlerInterceptor对userId的处理逻辑了。

feign拦截器

feign提供了一个拦截器的接口:

public interface RequestInterceptor {/*** Called for every request. Add data using methods on the supplied {@link RequestTemplate}.*/void apply(RequestTemplate template);
}

在这个接口中有一个RequestTemplate 对象,我们就可以使用这个对象来传递请求头。

1)需要定义一个拦截器的实现类

public class FeignRelayUserInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 从TL中获取用户idLong userId = UserContext.getUserId();if (userId == null) {return;}// 放入http的请求头中template.header("userId", userId.toString());}
}

2)在feign的配置类中注入这个拦截器

public class FeignConfig {@Beanpublic FeignRelayUserInterceptor feignRelayUserInterceptor(){return new FeignRelayUserInterceptor();}
}

3)在feign接口中引用这个配置类

@FeignClient(value = "user-service", url = "http://localhost:8081", configuration = FeignConfig.class)
public interface UserClient {@GetMapping("/user/{id}")public User queryById(@PathVariable("id") Long id);
}

测试

在服务提供者端从请求头中获取userId:

@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id,@RequestHeader("userId")Long userId) {log.info("============>userId:{}", userId);return userService.queryById(id);}

完整的源码下载:
https://github.com/xjs1919/enumdemo/tree/master/feign-interceptor-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/98599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货| ICML2023:作为自适应自进化规划器的扩散模型

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者介绍 梁志烜 香港大学计算机系直博一年级学生,导师为罗平教授,研究兴趣是生成式机器学习,Embodied AI和Data-centric learning。 报告题目 作为自适应自进化规划器的扩散…

F#奇妙游(28):ADT中简单值的F#实现

简单值的ADT 在领域建模中,我们尝尝会遇到一些简单的值,比如人的名字、人的编号、物品的代码。如果过早进行程序设计,这些值很容易就会变成程序设计语言中的基本量,string、int这些,就比如人的标号和物品的编号&#…

没有软件怎么管理固定资产

在当今数字化的世界中,我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而,当我们面临一个看似简单的问题——如何管理固定资产时,我们可能会感到困惑。那么,如果没有软件,我们该如何进行资产管理呢&#xf…

通过idea实现springboot集成mybatys

概述 使用springboot 集成 mybatys后,通过http请求接口,使得通过http请求可以直接直接操作数据库; 完成后端功能框架;前端是准备上小程序,调用https的请求接口用。简单实现后端框架; 详细 springboot 集…

面试被问到:测试计划和测试方案有什么区别?你会回答吗~

面试的时候,很多小伙伴都被面试官问过这个问题 “测试计划和测试方案有什么区别”? 到底有什么区别呢?我们先好好了解下这两个文档。 一、测试计划 1、测试计划是什么 测试计划是组织管理层面的文件,从组织管理的角度对一次测…

终于来啦!OpenDataLab 新增自主上传功能,升级CLI/SDK工具、数据集详情页……体验赠好礼~

9月,OpenDataLab 全新版本上线,支持用户自主发布原创数据集,同时升级了 CLI/SDK 工具、数据集详情页,让 AI 数据集开源更方便、展示更清晰。还有创作领好礼活动,快来看看吧! (注意!…

亚马逊重大更新,底层卖家的机会来了(干货)

最近,亚马逊对产品详细页面进行了又一次的改版。在这次改版中,亚马逊调整了产品详细页面的五点描述显示,无论是在电脑端还是移动端,大部分产品的五点描述都被折叠。 亚马逊的这一举动可能会改变传统的流量分配方式,进一…

(18)线程的实例认识:线程的控制,暂停,继续,停止,线程相互控制,协作

话不多,但比较中肯,本文参照c# 线程暂停继续的实现方式_哔哩哔哩_bilibili 一、老方式 1、这是一个老的实现方式,基本不推荐,背后控制的原理需要了解。 界面:三个button一个textbox …

Qt之事件过滤—筛选处理对象

文章目录 事件过滤完整代码 事件过滤 事件过滤是当事件发生时,可以对不同对象,实现不同操作,以达到筛选的效果。 步骤: 1、首先安装一个事件过滤器,为对象安装事件过滤,指定“谁”来监控这些事件对象 //给…

广告、政府、IT三重合作:凭爱校对轻松搞定文本质量

在广告创意、政府政策和IT开发这三个看似不相关的领域中,有一个共同的需求:高质量的文本内容。本文将探讨如何通过使用“爱校对”工具,在这三个行业内确保文本质量,从而提高工作效率和准确性。 广告行业:语境与创意的完…

全国唯一一所初试考Java的学校!平均300分拿下

苏州科技大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1187字,预计阅读:3分钟 2023考情概况 苏州科技…

SIP mini对讲 SV-10/SV-10W 86型sip对讲终端

SIP mini对讲 SV-10/SV-10W 86型sip对讲终端 A10系列是专门针对室内用户需求研发的一款SIP mini 对讲产品,集智能安防、音频对讲和广播功能于一体,功能强大,性价比高。它外观小巧,支持按键图标/功能自定义,配备3个可编…