SpringBoot+SpringCloud用户信息微服务传递实现解析
这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实现思路:
1:准备一个ThreadLocal变量,供线程之间共享。
2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中。
3:每个微服务在使用FeignClient调用别的微服务时,先从ThreadLocal里面取出user信息,并放在request的请求头中。
4:封装为一个注解,在启动类上标记即可。
代码样例:
1:ThreadLocal工具类:UserInfoContext
packagecom.test.domi.common.system;
importcom.test.domi.dao.UserInfo;
publicclassUserInfoContext{
privatestaticThreadLocaluserInfo=newThreadLocal();
publicstaticStringKEY_USERINFO_IN_HTTP_HEADER="X-AUTO-FP-USERINFO";
publicUserInfoContext(){
}
publicstaticUserInfogetUser(){
return(UserInfo)userInfo.get();
}
publicstaticvoidsetUser(UserInfouser){
userInfo.set(user);
}
}
2:准备承载用户信息的userInfo实体类(代码略)
3:编写拦截器:TransmitUserInfoFeighClientIntercepter
packagecom.test.domi.config;
importcom.alibaba.fastjson.JSON;
importcom.test.domi.common.system.UserInfoContext;
importcom.test.domi.dao.UserInfo;
importfeign.RequestInterceptor;
importfeign.RequestTemplate;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjava.io.UnsupportedEncodingException;
importjava.net.URLDecoder;
publicclassTransmitUserInfoFeighClientIntercepterimplementsRequestInterceptor{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TransmitUserInfoFeighClientIntercepter.class);
publicTransmitUserInfoFeighClientIntercepter(){
}
@Override
publicvoidapply(RequestTemplaterequestTemplate){
//从应用上下文中取出user信息,放入Feign的请求头中
UserInfouser=UserInfoContext.getUser();
if(user!=null){
try{
StringuserJson=JSON.toJSONString(user);
requestTemplate.header("KEY_USERINFO_IN_HTTP_HEADER",newString[]{URLDecoder.decode(userJson,"UTF-8")});
}catch(UnsupportedEncodingExceptione){
log.error("用户信息设置错误",e);
}
}
}
}
4:编写过滤器:TransmitUserInfoFilter
packagecom.test.domi.config;
importcom.alibaba.fastjson.JSON;
importcom.test.domi.common.system.UserInfoContext;
importcom.test.domi.dao.UserInfo;
importorg.apache.commons.lang.StringUtils;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjavax.servlet.*;
importjavax.servlet.http.HttpServletRequest;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.net.URLDecoder;
publicclassTransmitUserInfoFilterimplementsFilter{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TransmitUserInfoFeighClientIntercepter.class);
publicTransmitUserInfoFilter(){
}
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
@Override
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{
this.initUserInfo((HttpServletRequest)request);
chain.doFilter(request,response);
}
privatevoidinitUserInfo(HttpServletRequestrequest){
StringuserJson=request.getHeader("KEY_USERINFO_IN_HTTP_HEADER");
if(StringUtils.isNotBlank(userJson)){
try{
userJson=URLDecoder.decode(userJson,"UTF-8");
UserInfouserInfo=(UserInfo)JSON.parseObject(userJson,UserInfo.class);
//将UserInfo放入上下文中
UserInfoContext.setUser(userInfo);
}catch(UnsupportedEncodingExceptione){
log.error("inituserInfoerror",e);
}
}
}
@Override
publicvoiddestroy(){
}
}
5:编写注解实现类:EnableUserInfoTransmitterAutoConfiguration
packagespring.cloud.common.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importspring.cloud.common.interceptor.TransmitUserInfoFeighClientInterceptor;
importspring.cloud.common.filter.TransmitUserInfoFilter;
//@Configuration在业务端通过注解EanbleUserInfoTransmitter加载
publicclassEnableUserInfoTransmitterAutoConfiguration{
publicEnableUserInfoTransmitterAutoConfiguration(){
}
@Bean
publicTransmitUserInfoFeighClientInterceptortransmitUserInfo2FeighHttpHeader(){
System.out.println("-----TransmitUserInfoFeighClientInterceptor");
returnnewTransmitUserInfoFeighClientInterceptor();
}
@Bean
publicTransmitUserInfoFiltertransmitUserInfoFromHttpHeader(){
System.out.println("-----TransmitUserInfoFilter");
returnnewTransmitUserInfoFilter();
}
}
6:编写注解EnableUserInfoTransmitter
packagecom.test.domi.annotation;
importcom.test.domi.config.EnableUserInfoTransmitterAutoConfiguration;
importorg.springframework.context.annotation.Import;
importjava.lang.annotation.*;
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({EnableUserInfoTransmitterAutoConfiguration.class})
public@interfaceEnableUserInfoTransmitter{
}
7:在启动类上标记注解即可使用(无侵入)
packagecom.test.domi;
importcom.test.domi.annotation.EnableUserInfoTransmitter;
importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.test.domi.dao")
@EnableUserInfoTransmitter
publicclassTestCommonClient{
publicstaticvoidmain(String[]args){
SpringApplication.run(TestCommonClient.class,args);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
热门推荐
10 新人红包祝福语简短精辟
11 幼师给毕业祝福语简短
12 生日高考祝福语妹妹简短
13 下飞机祝福语简短英文
14 元宵发客户祝福语简短
15 爸妈金婚文案祝福语简短
16 新郎朋友红包祝福语简短
17 虎年五一祝福语大全简短
18 出阁宴祝福语姐姐简短