SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實現(xiàn)解析
這篇文章主要介紹了SpringBoot+SpringCloud實現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
實現(xiàn)思路:
1:準(zhǔn)備一個ThreadLocal變量,供線程之間共享。
2:每個微服務(wù)對所有過來的Feign調(diào)用進行過濾,然后從請求頭中獲取User用戶信息,并存在ThreadLocal變量中。
3:每個微服務(wù)在使用FeignClient調(diào)用別的微服務(wù)時,先從ThreadLocal里面取出user信息,并放在request的請求頭中。
4:封裝為一個注解,在啟動類上標(biāo)記即可。
代碼樣例:
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:準(zhǔn)備承載用戶信息的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) { //從應(yīng)用上下文中取出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("用戶信息設(shè)置錯誤",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() { } }
5:編寫注解實現(xiàn)類: EnableUserInfoTransmitterAutoConfiguration
package spring.cloud.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import spring.cloud.common.interceptor.TransmitUserInfoFeighClientInterceptor; import spring.cloud.common.filter.TransmitUserInfoFilter; //@Configuration 在業(yè)務(wù)端通過注解EanbleUserInfoTransmitter加載 public class EnableUserInfoTransmitterAutoConfiguration { public EnableUserInfoTransmitterAutoConfiguration() { } @Bean public TransmitUserInfoFeighClientInterceptor transmitUserInfo2FeighHttpHeader(){ System.out.println("-----TransmitUserInfoFeighClientInterceptor"); return new TransmitUserInfoFeighClientInterceptor(); } @Bean public TransmitUserInfoFilter transmitUserInfoFromHttpHeader(){ System.out.println("-----TransmitUserInfoFilter"); return new TransmitUserInfoFilter(); } }
6:編寫注解 EnableUserInfoTransmitter
package com.test.domi.annotation; import com.test.domi.config.EnableUserInfoTransmitterAutoConfiguration; import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Import({EnableUserInfoTransmitterAutoConfiguration.class}) public @interface EnableUserInfoTransmitter { }
7:在啟動類上標(biāo)記注解即可使用(無侵入)
package com.test.domi; import com.test.domi.annotation.EnableUserInfoTransmitter; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication @MapperScan("com.test.domi.dao") @EnableUserInfoTransmitter public class TestCommonClient { public static void main(String[] args){ SpringApplication.run(TestCommonClient.class,args); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot中獲取微信用戶信息的方法
- Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的實現(xiàn)代碼
- SpringBoot使用Redis的zset統(tǒng)計在線用戶信息
- Springboot通過請求頭獲取當(dāng)前用戶信息方法詳細示范
- SpringBoot登錄、退出、獲取用戶信息的session處理方案
- springboot如何完美通過token獲取用戶信息
- springboot登錄攔截器+ThreadLocal實現(xiàn)用戶信息存儲的實例代碼
- SpringBoot通過參數(shù)注解自動獲取當(dāng)前用戶信息的方法
- SpringBoot中的ThreadLocal保存請求用戶信息的實例demo
- springboot獲取當(dāng)前用戶信息的三種方式
相關(guān)文章
java?Stream流常見操作方法(反射,類加載器,類加載,反射)
這篇文章主要介紹了java?Stream流常見操作方法(反射,類加載器,類加載,反射),文章圍繞主題展開詳細的內(nèi)容介紹,展開詳細的內(nèi)容介紹,具有一定參考價值,感興趣的小伙伴可以參考一下2022-06-06Java向MySQL添加中文數(shù)據(jù)數(shù)據(jù)庫顯示亂碼的解決方案
在用springboot做項目時,由于重新安裝了本地Mysql數(shù)據(jù)庫(5.7版本)在前臺向數(shù)據(jù)庫插入和更新數(shù)據(jù)可的時候,涉及中文的時候在數(shù)據(jù)庫一直顯示異常,所以本文給大家介紹了相關(guān)的解決方案,需要的朋友可以參考下2024-02-02CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html
這篇文章主要介紹了CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html,這個技巧我們做任何網(wǎng)站都可以用到,而且非常好用。,需要的朋友可以參考下2019-06-06IDEA?2021.3?使用及idea2021.3.1激活使用方法
IDEA?全稱?IntelliJ?IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認為最好的java開發(fā)工具之一,今天通過本文給大家介紹idea2021.3.1激活及使用教程,感興趣的朋友一起看看吧2022-01-01基于java ssm springboot實現(xiàn)選課推薦交流平臺系統(tǒng)
這篇文章主要介紹了選課推薦交流平臺系統(tǒng)是基于java ssm springboot來的實現(xiàn)的,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Spring?Boot如何配置yml配置文件定義集合、數(shù)組和Map
這篇文章主要介紹了Spring?Boot?優(yōu)雅配置yml配置文件定義集合、數(shù)組和Map,包括Spring?Boot?yml配置文件定義基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的方式,需要的朋友可以參考下2023-10-10