最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實(shí)現(xiàn)解析

 更新時(shí)間:2019年11月13日 10:51:18   作者:cnblogs  
這篇文章主要介紹了SpringBoot+SpringCloud實(shí)現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了SpringBoot+SpringCloud實(shí)現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

實(shí)現(xiàn)思路:

1:準(zhǔn)備一個(gè)ThreadLocal變量,供線程之間共享。

2:每個(gè)微服務(wù)對(duì)所有過來的Feign調(diào)用進(jìn)行過濾,然后從請(qǐng)求頭中獲取User用戶信息,并存在ThreadLocal變量中。

3:每個(gè)微服務(wù)在使用FeignClient調(diào)用別的微服務(wù)時(shí),先從ThreadLocal里面取出user信息,并放在request的請(qǐng)求頭中。

4:封裝為一個(gè)注解,在啟動(dòng)類上標(biāo)記即可。

代碼樣例:

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:準(zhǔn)備承載用戶信息的userInfo實(shí)體類(代碼略)

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) {
    //從應(yīng)用上下文中取出user信息,放入Feign的請(qǐng)求頭中
    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("用戶信息設(shè)置錯(cuò)誤",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:編寫注解實(shí)現(xiàn)類: 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 在業(yè)務(wù)端通過注解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:在啟動(dòng)類上標(biāo)記注解即可使用(無侵入)

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);
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編譯器用maven打war包出錯(cuò)解決辦法

    Java編譯器用maven打war包出錯(cuò)解決辦法

    這篇文章主要介紹了用maven打war包出錯(cuò)的解決辦法,需要的朋友可以參考下
    2018-03-03
  • SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解

    SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 一篇文章帶你入門Java多線程

    一篇文章帶你入門Java多線程

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-08-08
  • 詳解Spring整合Ehcache管理緩存

    詳解Spring整合Ehcache管理緩存

    本文先通過Ehcache應(yīng)用的范例來介紹它的基本使用方法,然后再介紹與Spring整合的方法,
    2017-03-03
  • Java線程休眠之sleep方法詳解

    Java線程休眠之sleep方法詳解

    這篇文章主要介紹了Java線程休眠之sleep方法詳解,Thread?類中有一個(gè)靜態(tài)方法的sleep方法,當(dāng)該線程調(diào)用sleep方法后,就會(huì)暫時(shí)讓CPU的調(diào)度權(quán),但是監(jiān)視器資源比如鎖并不會(huì)釋放出去,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)圖形化界面計(jì)算器

    java實(shí)現(xiàn)圖形化界面計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖形化界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • spring如何動(dòng)態(tài)指定具體實(shí)現(xiàn)類

    spring如何動(dòng)態(tài)指定具體實(shí)現(xiàn)類

    這篇文章主要為大家詳細(xì)介紹了spring如何動(dòng)態(tài)指定具體實(shí)現(xiàn)類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java使用Zxing二維碼生成的簡(jiǎn)單示例

    Java使用Zxing二維碼生成的簡(jiǎn)單示例

    ZXing是一個(gè)開源的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫,下面這篇文章主要給大家介紹了關(guān)于Java使用Zxing二維碼生成的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • SpringCloud基于SpringAMQP實(shí)現(xiàn)消息隊(duì)列及原理解析

    SpringCloud基于SpringAMQP實(shí)現(xiàn)消息隊(duì)列及原理解析

    Spring AMQP作為Spring框架的一部分,是一套用于支持高級(jí)消息隊(duì)列協(xié)議(AMQP)的工具,這篇文章主要介紹了SpringCloud基于SpringAMQP實(shí)現(xiàn)消息隊(duì)列及原理解析,需要的朋友可以參考下
    2024-04-04
  • 詳解SpringCloud的負(fù)載均衡

    詳解SpringCloud的負(fù)載均衡

    這篇文章主要介紹了SpringCloud的負(fù)載均衡的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用SpringCloud,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論

安阳县| 天水市| 栾川县| 广宗县| 鹿邑县| 琼海市| 离岛区| 北辰区| 马公市| 什邡市| 陆良县| 楚雄市| 巴东县| 岳阳县| 莱州市| 英德市| 青州市| 布尔津县| 乐业县| 江陵县| 烟台市| 张北县| 刚察县| 双峰县| 宾阳县| 普宁市| 读书| 惠安县| 龙陵县| 巢湖市| 遵义县| 北票市| 吉木乃县| 如皋市| 连城县| 子长县| 娱乐| 九龙城区| 包头市| 凉城县| 平利县|