国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 幫助中心 > 正文

SpringBoot+SpringCloud用戶信息微服務傳遞實現解析

2024-07-09 22:41:23
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了SpringBoot+SpringCloud實現登錄用戶信息在微服務之間的傳遞,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

實現思路:

1:準備一個ThreadLocal變量,供線程之間共享。

2:每個微服務對所有過來的Feign調用進行過濾,然后從請求頭中獲取User用戶信息,并存在ThreadLocal變量中。

3:每個微服務在使用FeignClient調用別的微服務時,先從ThreadLocal里面取出user信息,并放在request的請求頭中。

4:封裝為一個注解,在啟動類上標記即可。

代碼樣例:

1:ThreadLocal工具類 :UserInfoContext

package com.test.domi.common.system;import com.test.domi.dao.UserInfo;public class UserInfoContext {  private static ThreadLocal<UserInfo> userInfo = new ThreadLocal<UserInfo>();  public static String KEY_USERINFO_IN_HTTP_HEADER = "X-AUTO-FP-USERINFO";  public UserInfoContext() {  }  public static UserInfo getUser(){    return (UserInfo)userInfo.get();  }  public static void setUser(UserInfo user){    userInfo.set(user);  }}

2:準備承載用戶信息的userInfo實體類(代碼略)

3:編寫攔截器 : TransmitUserInfoFeighClientIntercepter

package com.test.domi.config;import com.alibaba.fastjson.JSON;import com.test.domi.common.system.UserInfoContext;import com.test.domi.dao.UserInfo;import feign.RequestInterceptor;import feign.RequestTemplate;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;public class TransmitUserInfoFeighClientIntercepter implements RequestInterceptor {  private static final Logger log = LoggerFactory.getLogger(TransmitUserInfoFeighClientIntercepter.class);  public TransmitUserInfoFeighClientIntercepter() {  }  @Override  public void apply(RequestTemplate requestTemplate) {    //從應用上下文中取出user信息,放入Feign的請求頭中    UserInfo user = UserInfoContext.getUser();    if (user != null) {      try {        String userJson = JSON.toJSONString(user);        requestTemplate.header("KEY_USERINFO_IN_HTTP_HEADER",new String[]{URLDecoder.decode(userJson,"UTF-8")});      } catch (UnsupportedEncodingException e) {        log.error("用戶信息設置錯誤",e);      }    }  }}

4:編寫過濾器:TransmitUserInfoFilter

package com.test.domi.config;import com.alibaba.fastjson.JSON;import com.test.domi.common.system.UserInfoContext;import com.test.domi.dao.UserInfo;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;public class TransmitUserInfoFilter implements Filter {  private static final Logger log = LoggerFactory.getLogger(TransmitUserInfoFeighClientIntercepter.class);  public TransmitUserInfoFilter() {  }  @Override  public void init(FilterConfig filterConfig) throws ServletException {  }  @Override  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    this.initUserInfo((HttpServletRequest)request);    chain.doFilter(request,response);  }  private void initUserInfo(HttpServletRequest request){    String userJson = request.getHeader("KEY_USERINFO_IN_HTTP_HEADER");    if (StringUtils.isNotBlank(userJson)) {      try {        userJson = URLDecoder.decode(userJson,"UTF-8");        UserInfo userInfo = (UserInfo) JSON.parseObject(userJson,UserInfo.class);        //將UserInfo放入上下文中        UserInfoContext.setUser(userInfo);      } catch (UnsupportedEncodingException e) {        log.error("init userInfo error",e);      }    }  }  @Override  public void destroy() {  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 斗六市| 晋城| 台山市| 云霄县| 鄢陵县| 隆子县| 若羌县| 新宁县| 宿松县| 定日县| 江达县| 芒康县| 伊金霍洛旗| 平遥县| 葫芦岛市| 独山县| 梁平县| 岳阳市| 朝阳县| 绥中县| 岐山县| 曲阜市| 汝州市| 邵武市| 揭东县| 泗阳县| 德江县| 河曲县| 深圳市| 虹口区| 阳新县| 乐昌市| 福安市| 龙山县| 启东市| 哈尔滨市| 蒲城县| 敖汉旗| 固安县| 苍山县| 登封市|