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)文章
SpringAOP切點函數(shù)實現(xiàn)原理詳解
這篇文章主要介紹了SpringAOP切點函數(shù)實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
SpringCloud基于SpringAMQP實現(xiàn)消息隊列及原理解析
Spring AMQP作為Spring框架的一部分,是一套用于支持高級消息隊列協(xié)議(AMQP)的工具,這篇文章主要介紹了SpringCloud基于SpringAMQP實現(xiàn)消息隊列及原理解析,需要的朋友可以參考下2024-04-04

