国色天香在线观看全集免费播放

你的位置:国色天香在线观看全集免费播放 > 国产精品久久久天天影视香蕉 > 国产精品久久久天天影视香蕉

实战!openFeign怎样完了全链路JWT令牌信息不丢失?

发布日期:2022-06-18 17:02    点击次数:189

实战!openFeign怎样完了全链路JWT令牌信息不丢失?

​​

今天这篇著作先容一下JWT令牌如安在微就业链路中保证信息不丢失?官方称为令牌中继。

什么是令牌中继?

令牌中继等闲的讲则是让令牌在微就业链路调用中传递下去,保证各个微就业约略获得令牌中的用户信息。

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

​​

下单历程

客户端佩戴令牌央求网关,网关鉴权奏效后会将令牌中的用户信息表示出来放在央求头中下发给订单就业,相似的,订单就业需要将用户信息传递给账户就业获得该用户的账户信息。

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

处罚决策

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

珍摄:openFeign在开启熔断左迁后里面调用开启了子线程,因此传统的决策径直在RequestInterceptor中开拓是不可行的。

那么怎样保证子线程也能获得央求头中的用户信息呢?

谜底是:RequestContextHolder这个神器。

RequestContextHolder里面通过InheritableThreadLocal完强健线程分享信息。

在FeignCircuitBreakerInvocationHandler这个类中亦然有如下一转代码:

中文字幕精品无码亚洲幕 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">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;     } } 

源码目次如下图:

​​