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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。