社区编辑申请
注册/登录
实战!openFeign如何实现全链路JWT令牌信息不丢失?
开发 前端
令牌中继通俗的讲则是让令牌在微服务链路调用中传递下去,保证各个微服务能够获取令牌中的用户信息。

今天这篇文章介绍一下JWT令牌如何在微服务链路中保证信息不丢失?官方称为令牌中继。

什么是令牌中继?

令牌中继通俗的讲则是让令牌在微服务链路调用中传递下去,保证各个微服务能够获取令牌中的用户信息。

以下订单的例子来说,如下图:

下单流程

客户端携带令牌请求网关,网关鉴权成功后会将令牌中的用户信息解析出来放在请求头中下发给订单服务,同样的,订单服务需要将用户信息传递给账户服务获取该用户的账户信息。

那么问题来了?如何保证网关服务->订单服务->账户服务这条链路中的用户信息传递下去是个痛点

解决方案

令牌在openFeign调用过程中是不能自动中继的,因此必须手动的将令牌信息传递下去。

注意:openFeign在开启熔断降级后内部调用开启了子线程,因此传统的方案直接在RequestInterceptor中设置是不可行的。

那么如何保证子线程也能获取请求头中的用户信息呢?

答案是:RequestContextHolder这个神器。

RequestContextHolder内部通过InheritableThreadLocal实现子线程共享信息。

在FeignCircuitBreakerInvocationHandler这个类中也是有如下一行代码:

RequestContextHolder.setRequestAttributes(requestAttributes); 



正是使用RequestContextHolder将request的信息保存在其中,因此实现令牌中继只需要读取RequestContextHolder的信息即可。

详细代码如下:

/**  * @author 公众号:码猿技术专栏  * 用于实现令牌信息中继  */ @Component public class FeignRequestInterceptor implements RequestInterceptor {     @Override     public void apply(RequestTemplate template) {         //从RequestContextHolder中获取HttpServletRequest         HttpServletRequest httpServletRequest = RequestContextUtils.getRequest();         //获取RequestContextHolder中的信息         Map<String, String> headers = getHeaders(httpServletRequest);         //放入feign的RequestTemplate中         for (Map.Entry<String, String> entry : headers.entrySet()) {             template.header(entry.getKey(), entry.getValue());         }     }      /**      * 获取原请求头      */     private Map<String, String> getHeaders(HttpServletRequest request) {         Map<String, String> map = new LinkedHashMap<>();         Enumeration<String> enumeration = request.getHeaderNames();         if (enumeration != null) {             while (enumeration.hasMoreElements()) {                 String key = enumeration.nextElement();                 String value = request.getHeader(key);                 map.put(key, value);             }         }         return map;     } } 



源码目录如下图:


责任编辑:武晓燕 来源: 码猿技术专栏
相关推荐

2022-05-25 09:00:00

令牌JWT安全

2021-12-30 08:13:00

2021-10-22 09:00:59

2022-04-27 10:53:34

web优化性能

2022-03-23 12:45:12

JWT登录认证

2022-05-19 13:33:39

系统客户端链路追踪

2022-05-24 14:07:53

OpenFeignSpring开源

2022-05-16 10:36:08

GitHub开源项目

2021-02-19 08:20:42

JWT网络原理

2022-05-17 09:02:30

2022-04-25 11:26:16

开发SpringBoot

2022-03-22 07:37:04

2022-04-19 08:15:53

DDD领域建模实战

2022-05-23 08:23:24

2022-04-21 09:00:00

API安全密钥

2022-05-17 11:06:44

数据库MySQL系统

2022-04-09 14:45:02

2022-05-11 08:22:21

服务网关架构

2022-04-20 07:48:09

微服务链路服务器

2022-05-10 14:11:05

网络安全网络犯罪

同话题下的热门内容

让程序员心动的11种新编程语言Flutter vs ReactJS:2022年应该选哪个?再有人问你什么是分库分表,直接把这篇文章发给他前端配置化真香~上班又多了60%的摸鱼时间2022年值得使用的 Node.js 框架HTTP 的缓存为什么这么设计?前端监控的搭建步骤,别再一头雾水了!如何加快Java中大型集合的处理

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号