1. 程式人生 > 其它 >記錄一次SpringCloud Fegin遠端調用出現的問題

記錄一次SpringCloud Fegin遠端調用出現的問題

問題描述

在公司一次介面呼叫的時候,由於所有的介面都需要在請求頭上設定token來驗證身份,所以我從本服務呼叫遠端服務的時候使用了feign來呼叫,但是出現了一個很致命的問題,由於我用了執行緒池,導致request被銷燬,在子執行緒中無法訪問主執行緒的request(其實就算能訪問到也被銷燬了),所以呼叫的時候顯示未登入。


同時我也使用攔截器做了處理,但是由於request已經不是主執行緒那個request,所以在用執行緒池非同步呼叫遠端介面時,根本無法使用。

@Configuration
public class FeignConfiguration implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }
    }
}

解決思路

首先由於request已經被銷燬,那麼我就只能先把我所需要的token儲存下來,將token傳入進來之後,事情就好辦了許多,我們在fegin呼叫的時候,會使用feginClient將介面暴露到我們的程式碼裡,這時候只需要在方法的引數前面上使用@RequestHeader就可以將我們所需要的token設定到header裡

@FeignClient(name = "test", url = "${test-url}")
@Component
public interface TestFegin {
	@PostMapping(value = "/auth/oauth/token")
	JSONObject getList(@RequestHeader("token") String token,
	                    @RequestParam("username") String username,
	                    @RequestParam("password") String password);
}

這裡感謝兩篇部落格提供的解決思路

Spring Cloud Feign 請求時附帶請求頭

已解決)如何在呼叫fegin介面時設定請求頭header和傳入引數