2017-02-08 65 views
4

我設置我的頭和HTTP調用是這樣的:角2 HTTP不設頭

var headers = new Headers(); 
headers.set('Authorization','Bearer xxxxxxxxxxx'); 

this.http.get('http://localhost:8080/outputEndpoints', { 
    headers: headers 
}). 
map(res => res.text()) 

.subscribe(
    data=> console.log(data), 
    error=> console.log("Getting Error") 
); 

有了這個,我預期的標題是:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch, br 
Accept-Language:es,ca;q=0.8,en-GB;q=0.6,en;q=0.4,fr;q=0.2 
Access-Control-Request-Headers:authorization, content-type 
Authorization: "Bearer xxxxxxxxxxxx" 
Access-Control-Request-Method:GET 
Connection:keep-alive 
Host:localhost:8080 
Origin:http://localhost:3000 
Referer:http://localhost:3000/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 

相反,我得到以下(不與令牌授權):

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch, br 
Accept-Language:es,ca;q=0.8,en-GB;q=0.6,en;q=0.4,fr;q=0.2 
Access-Control-Request-Headers:authorization, content-type 
Access-Control-Request-Method:GET 
Connection:keep-alive 
Host:localhost:8080 
Origin:http://localhost:3000 
Referer:http://localhost:3000/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 

編輯:

一般的信息是:

Request URL:http://localhost:8080/outputEndpoints 
Request Method:OPTIONS 
Status Code:401 
Remote Address:[::1]:8080 

因此選項調用失敗。在其他應用程序中,一旦OPTIONS調用被接受,它就會發出GET請求,您可以在其中找到設置的身份驗證令牌。這意味着由於某種原因,OPTION稱它不被接受。

使用CURL或SOAP UI進行調用時,它工作正常,所以我認爲它不是CORS的問題。我是對的?

任何想法或指導將是非常有益的。

+0

你找到解決辦法嗎?同樣的問題在這裏 – stackdave

回答

0

本指南http://restlet.com/blog/2015/12/15/understanding-and-using-cors/你可以閱讀下面的下面:

一項重要的觀點。您必須考慮到,執行 包含安全性的CORS請求(即授權標頭)時,OPTIONS請求不會包含它。因此,在處理預衝的第一個OPTIONS請求時,您需要注意安全性 。 事實上,在此 級別上不能進行身份驗證檢查。

因此,在第一個OPTION調用中沒有授權標頭。

+0

但你是如何解決它的?你能顯示代碼嗎?我從我的服務器得到錯誤,而不是郵差或捲曲,只是與角4.1.2 – stackdave

+0

api程序員告訴我,OPTIONS必須有授權代碼,所以api的工作原理是這樣的,但我的瀏覽器不發送選項與身份驗證,如何強制我的瀏覽器做到這一點? – stackdave

+0

如果沒有jwt授權,它將發送沒有OPTIONS的普通請求 – ZanattMan

1

我認爲這是headers.append而不是headers.set。嘗試改變你的方法,看看它是否有效。

+0

我已經嘗試過,而且都沒有工作。當打印標題選項時,它會接縫,但是當我在網絡選項卡中檢查它時,它不在那裏。 – ZanattMan

1

您應該設置的值在頭這樣的構造:

var headers = new Headers({'Authorization', 'Bearer XXXXXXX'}); 

,或者你必須使用append方法:

var headers = new Headers(); 
headers.append('Authorization', 'Bearer XXXXXX'); 

由於改變的問題編輯:

因爲我真的不知道如何處理您的請求,所以我可以向您展示我在Spring後端提出的解決方案:

if ("OPTIONS".equals(request.method, ignoreCase = true)) { 
    response.status = HttpServletResponse.SC_OK 
} else { 
    chain.doFilter(req, res) 
} 

因此,在您的後端,您應該檢查請求方法,如果它等於「OPTIONS」,那麼您可以將響應狀態設置爲200並完成。

+0

我已經使用了所有已知的方法(構造函數,追加和設置),並且它們都不起作用。在控制檯中打印標題時,它的接縫工作正常,但在導航選項卡中沒有授權標頭(如控制檯中所示) – ZanattMan

+0

正如我在問題中所做的擴展,它不會通過OPTIONS調用,而是標頭設置正確。那麼問題是爲什麼在第一個OPTIONS調用中失敗。 – ZanattMan

0

此行添加到您的安全配置:

.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()