SpringBoot+SpringCloud用户信息微服务传递实现解析

作者:cnblogs 时间:2022-12-08 13:51:42 

这篇文章主要介绍了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

标签:spring,boot,cloud,用户,信息,微服务,传递
0
投稿

猜你喜欢

  • 全面详解Maven打包及其相关插件和高级特性

    2022-03-03 21:10:00
  • 详解Java中ArrayList类

    2021-10-25 21:42:33
  • Java Swing GridBagLayout网格袋布局的实现

    2023-07-11 19:34:26
  • java编写贪吃蛇小游戏

    2023-06-19 01:49:54
  • Java日常练习题,每天进步一点点(52)

    2023-03-31 11:23:46
  • SpringCloud远程服务调用实战笔记

    2022-07-13 06:40:19
  • maven springboot如何将jar包打包到指定目录

    2022-12-09 00:40:25
  • c#中WebService的介绍及调用方式小结

    2021-05-29 00:10:17
  • SpringBoot整合ES-Elasticsearch的实例

    2022-12-29 03:30:40
  • Java数据结构之顺序表和链表精解

    2021-07-01 14:30:39
  • MyBatis查询时属性名和字段名不一致问题的解决方法

    2023-10-23 16:56:36
  • SpringMVC源码解读之HandlerMapping

    2023-07-23 22:18:05
  • Java三目运算中隐藏的自动拆装箱

    2023-11-29 10:47:10
  • 浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    2022-10-20 06:58:41
  • Spark SQL配置及使用教程

    2023-02-28 06:02:30
  • 谈谈Java类型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType

    2022-10-18 17:43:07
  • Android 基于IntentService的文件下载的示例代码

    2023-10-28 23:26:02
  • Android实现点击AlertDialog上按钮时不关闭对话框的方法

    2022-07-28 07:39:51
  • Java泛型类与泛型方法的定义详解

    2023-11-25 01:29:22
  • Java中static静态变量的初始化完全解析

    2023-11-27 21:03:39
  • asp之家 软件编程 m.aspxhome.com