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

feign之間傳遞oauth2?token的問題及解決方案

 更新時(shí)間:2022年03月15日 15:06:34   作者:張占嶺  
這篇文章主要介紹了feign之間傳遞oauth2?token的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

feign之間傳遞oauth2 token問題

在微服務(wù)架構(gòu)里,服務(wù)與服務(wù)之間的調(diào)用一般用feign就可以實(shí)現(xiàn),它是一種可視化的rpc,并且集成了ribbon的負(fù)載均衡能力,所以很受歡迎。

授權(quán)服務(wù)

在授權(quán)服務(wù)里,用戶通過用戶名密碼,或者手機(jī)和驗(yàn)證碼等方式登陸之后,在http頭里會(huì)有授權(quán)的標(biāo)識(shí),在客戶端調(diào)用時(shí),需要添加當(dāng)時(shí)有效的token才可以正常訪問被授權(quán)的頁面。

Content-Type:application/jsonAuthorization:Bearer d79c064c-8675-4047-a119-fac692e447e8

而在業(yè)務(wù)層里,服務(wù)與服務(wù)之間使用feign來實(shí)現(xiàn)調(diào)用,而授權(quán)的代碼我們可以通過攔截器實(shí)現(xiàn),在feign請(qǐng)求之前,把當(dāng)前服務(wù)的token添加到目標(biāo)服務(wù)的請(qǐng)求頭就可以了,一般是這樣實(shí)現(xiàn)的。

/**
?* 發(fā)送FeignClient設(shè)置Header信息.
?* http://www.itmuch.com/spring-cloud-sum/hystrix-threadlocal/
?* Hystrix傳播ThreadLocal對(duì)象
?*/
@Component
public class TokenFeignClientInterceptor implements RequestInterceptor {
? /**
? ?* token放在請(qǐng)求頭.
? ?*
? ?* @param requestTemplate 請(qǐng)求參數(shù)
? ?*/
? @Override
? public void apply(RequestTemplate requestTemplate) {
? ? RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
? ? if (requestAttributes != null) {
? ? ? HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
? ? ? String token = request.getHeader(TokenContext.KEY_OAUTH2_TOKEN);
? ? ? requestTemplate.header(TokenContext.KEY_OAUTH2_TOKEN,
? ? ? ? ? new String[] {token});
? ? }
? }
}

上面的攔截器代碼沒有什么問題,也很好理解,但事實(shí)上,當(dāng)你的feign開啟了hystrix功能,如果開啟了,需要把hystrix的策略進(jìn)行修改,默認(rèn)是THREAD的,這個(gè)級(jí)別時(shí)ThreadLocal是空的,所以你的授權(quán)不能傳給feign的攔截器.

hystrix.command.default.execution.isolation.strategy: SEMAPHORE?

資源項(xiàng)目里獲取當(dāng)前用戶

在另一個(gè)項(xiàng)目,需要其它獲取當(dāng)前用戶,需要使用下面的代碼。

先配置一個(gè)授權(quán)的地址

security:
? oauth2:
? ? resource:
? ? ? id: user
? ? ? user-info-uri: http://${auth.host:localhost}:${auth.port:8002}/user # 這里是授權(quán)服務(wù)的地址,即auth-service
? ? ? prefer-token-info: false
auth:
? host: localhost ?#這個(gè)不可以用eureka里的服務(wù)名,只能使用docker-compose里的服務(wù)名
? port: 8002

下面的代碼用來獲取當(dāng)前用戶

?Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
? ? String user = objectMapper.writeValueAsString(authentication.getPrincipal());

主要對(duì)feign的請(qǐng)求頭傳遞信息進(jìn)行講解分享給大家,各位多注意下!

oauth2 feign報(bào)401的錯(cuò)誤

報(bào)錯(cuò)問題:

feign.FeignException: status 401 reading UserFeign#queryUser(Long,String,String,String,Integer,Integer,Integer)

解決方法

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
@Configuration
public class FeignOauth2RequestInterceptor implements RequestInterceptor {
    private final String AUTHORIZATION_HEADER = "Authorization";
    private final String BEARER_TOKEN_TYPE = "Bearer";
    @Override
    public void apply(RequestTemplate requestTemplate) {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null && authentication.getDetails() instanceof OAuth2AuthenticationDetails) {
            OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
            requestTemplate.header(AUTHORIZATION_HEADER, String.format("%s %s", BEARER_TOKEN_TYPE, details.getTokenValue()));
        }
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • AsyncHttpClient的TimeoutTimerTask連接池異步超時(shí)

    AsyncHttpClient的TimeoutTimerTask連接池異步超時(shí)

    這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時(shí)源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng)

    了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng)

    這篇文章主要介紹了了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng),微服務(wù)化產(chǎn)品線,每一個(gè)服務(wù)專心于自己的業(yè)務(wù)邏輯,并對(duì)外提供相應(yīng)的接口,看上去似乎很明了,其實(shí)還有很多的東西需要考慮,,需要的朋友可以參考下
    2019-06-06
  • Java ConcurrentHashMap鎖分段機(jī)制使用及代碼實(shí)例

    Java ConcurrentHashMap鎖分段機(jī)制使用及代碼實(shí)例

    ConcurrentHashMap是Java中的一種線程安全的哈希表,通過鎖分段機(jī)制提高了并發(fā)性能,在Java 8中,ConcurrentHashMap引入了CAS操作和更復(fù)雜的節(jié)點(diǎn)繼承結(jié)構(gòu),進(jìn)一步優(yōu)化了并發(fā)操作
    2025-01-01
  • springboot接收json數(shù)據(jù)時(shí),接收到空值問題

    springboot接收json數(shù)據(jù)時(shí),接收到空值問題

    這篇文章主要介紹了springboot接收json數(shù)據(jù)時(shí),接收到空值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Window中安裝構(gòu)建神器Jenkins詳解

    Window中安裝構(gòu)建神器Jenkins詳解

    Jenkins是一款開源 CI&CD 軟件,用于自動(dòng)化各種任務(wù),包括構(gòu)建、測試和部署軟件。支持各種運(yùn)行方式,可通過系統(tǒng)包、Docker 或者通過一個(gè)獨(dú)立的 Java 程序。是解放人工集成部署的自動(dòng)化構(gòu)建神器
    2021-07-07
  • SpringBoot @ExceptionHandler與@ControllerAdvice異常處理詳解

    SpringBoot @ExceptionHandler與@ControllerAdvice異常處理詳解

    在Spring Boot應(yīng)用的開發(fā)中,不管是對(duì)底層數(shù)據(jù)庫操作,對(duì)業(yè)務(wù)層操作,還是對(duì)控制層操作,都會(huì)不可避免的遇到各種可預(yù)知的,不可預(yù)知的異常需要處理,如果每個(gè)處理過程都單獨(dú)處理異常,那么系統(tǒng)的代碼耦合度會(huì)很高,工作量大且不好統(tǒng)一,以后維護(hù)的工作量也很大
    2022-10-10
  • Mybatis查詢條件包含List的情況說明

    Mybatis查詢條件包含List的情況說明

    這篇文章主要介紹了Mybatis 查詢條件包含List的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 如何通過javacv實(shí)現(xiàn)圖片去水?。ǜ酱a)

    如何通過javacv實(shí)現(xiàn)圖片去水?。ǜ酱a)

    這篇文章主要介紹了如何通過javacv實(shí)現(xiàn)圖片去水印(附代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案

    詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案

    這篇文章主要介紹了詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java讀取證書公鑰的實(shí)現(xiàn)

    java讀取證書公鑰的實(shí)現(xiàn)

    這篇文章主要介紹了java讀取證書公鑰的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評(píng)論

宾阳县| 新蔡县| 桂东县| 当涂县| 神农架林区| 张家港市| 林甸县| 定结县| 吕梁市| 清水县| 梓潼县| 青海省| 洞头县| 澜沧| 滨海县| 漳州市| 淅川县| 祁门县| 平南县| 仁寿县| 和硕县| 合川市| 溧阳市| 玉溪市| 包头市| 双城市| 新津县| 娱乐| 常州市| 伊宁县| 英山县| 金门县| 军事| 东丽区| 海城市| 涞源县| 汕头市| 武穴市| 济源市| 义马市| 临颍县|