SpringBoot+SpringCloud用户信息微服务传递实现解析
作者:cnblogs 发布时间:2022-12-08 13:51:42
标签:spring,boot,cloud,用户,信息,微服务,传递
这篇文章主要介绍了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() {
}
}
5:编写注解实现类: 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 在业务端通过注解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:在启动类上标记注解即可使用(无侵入)
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);
}
}
来源:https://www.cnblogs.com/domi22/p/9248536.html


猜你喜欢
- 1、原来是将EditView放到了popupwindow,发现EditView原有的复制、粘贴、全选、选择功能失效了,所以便用DialogF
- SpringCloud是分布式微服务架构的一站式解决方案,十多种微服务架构落地技术的集合体,俗称微服务全家桶SpringCloud和Spri
- 刚开始我以为熔断和降级是一体的,以为他们必须配合使用; 只不过名字不一样而已,但是当我经过思考过后,发现他们其实不是一个东西;降级什么是服务
- 一、项目前提1、购物车并不是一直放数据库2、选择使用的技术:session:(购物车项目使用session)好处:快(放在内存当中),存对象
- public void add(intindex, Eelement)从index索引的位置添加element元素,后面的元素都往
- 这篇效果和上一篇:https://www.jb51.net/article/100638.htm的效果是一样的,但是不再在OnTouchEv
- 苹果的iphone有语音识别用的是Google的技术,做为Google力推的Android 自然会将其核心技术往Android 系统里面植入
- 上一篇文章讲解了Spring Cloud 整合 nacos 实现服务注册与发现,nacos除了有服务注册与发现的功能,还有提供动态配置服务的
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- a)原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…
- 方法的返回值为什么要有带返回值的方法呢?调用处拿到方法的结果之后,才能根据结果进行下一步操作带返回值方法的定义和调用:如果在调用处,要根据方
- 本文实例讲述了Android编程之短信列表的时间显示。分享给大家供大家参考,具体如下:Android的短信的时间的显示做的很精细,首先保存在
- 1. 继承1. 子类继承了父类,获得父类的全部Field和方法。子类Student类继承父类,将可以获得父类的全部Field和方法publi
- 用一道选择题作为本文的开始吧! ArrayList list = new ArrayList(20);中的list扩充几次 A.0 B.1
- 不久前项目开始了一段时间了,刚开始怀疑是Android Studio中新加入的Instant Run功能引起的,于是重新打release包后
- ChatGPT的基本介绍ChatGPT是一个用来进行自然语言处理任务的预训练模型。要使用ChatGPT,需要了解以下几点:理解预训练模型:预
- 本文实例讲述了Java Base64算法实际应用之邮件发送。分享给大家供大家参考,具体如下:一 利用telnet和Base64来实现收发邮件
- 控制json序列化/反序列化1. @JsonIgnoreProperties的用法@JsonIgnoreProperties(value =
- 前言这是用testng框架加selenium做的一个UI自动化测试的项目Java代码package com.justin;/**?* @au
- 一、layui.use1、LayUI的官方使用文档:https://www.layui.com/doc/2、layui的内置模块不是默认就加