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

 更新时间:2019年11月13日 10:51:18   作者:cnblogs  
这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java Stream流常见操作方法(反射,类加载器,类加载,反射)

    java Stream流常见操作方法(反射,类加载器,类加载,反射)

    这篇文章主要介绍了java Stream流常见操作方法(反射,类加载器,类加载,反射),文章围绕主题展开详细的内容介绍,展开详细的内容介绍,具有一定参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • 浅谈Spring Context加载方式

    浅谈Spring Context加载方式

    这篇文章主要介绍了浅谈Spring Context加载方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java面试题冲刺第二十三天--分布式

    Java面试题冲刺第二十三天--分布式

    这篇文章主要为大家分享了最有价值的三道关于分布式的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java向MySQL添加中文数据数据库显示乱码的解决方案

    Java向MySQL添加中文数据数据库显示乱码的解决方案

    在用springboot做项目时,由于重新安装了本地Mysql数据库(5.7版本)在前台向数据库插入和更新数据可的时候,涉及中文的时候在数据库一直显示异常,所以本文给大家介绍了相关的解决方案,需要的朋友可以参考下
    2024-02-02
  • CommonMark 使用教程:将 Markdown 语法转成 Html

    CommonMark 使用教程:将 Markdown 语法转成 Html

    这篇文章主要介绍了CommonMark 使用教程:将 Markdown 语法转成 Html,这个技巧我们做任何网站都可以用到,而且非常好用。,需要的朋友可以参考下
    2019-06-06
  • java中接口(interface)及使用方法示例

    java中接口(interface)及使用方法示例

    这篇文章主要介绍了java中接口(interface)及使用方法示例,涉及接口定义的简单介绍以及Java语言代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,今天通过本文给大家介绍idea2021.3.1激活及使用教程,感兴趣的朋友一起看看吧
    2022-01-01
  • 基于java ssm springboot实现选课推荐交流平台系统

    基于java ssm springboot实现选课推荐交流平台系统

    这篇文章主要介绍了选课推荐交流平台系统是基于java ssm springboot来的实现的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • mybatis trim标签的使用详解

    mybatis trim标签的使用详解

    这篇文章主要介绍了mybatis trim标签的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Boot如何配置yml配置文件定义集合、数组和Map

    Spring Boot如何配置yml配置文件定义集合、数组和Map

    这篇文章主要介绍了Spring Boot 优雅配置yml配置文件定义集合、数组和Map,包括Spring Boot yml配置文件定义基本数据类型和引用数据类型的方式,需要的朋友可以参考下
    2023-10-10

最新评论