2014-09-23 47 views
4

我有一個AngularJS $ http攔截器來攔截請求和響應。 我需要訪問攔截器的請求方法中的幾個請求標頭。爲什麼AngularJS請求攔截器的配置參數中沒有所有請求頭文件?

但是,當我控制檯登錄配置對象作爲參數收到請求方法,我可以看到config.headers下只有一個頭;這是

Accept: "application/json, text/plain, */*"

和開發者的工具正顯示出像

Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:mr,en-US;q=0.8,en;q=0.6 
Connection:keep-alive 
Host:localhost:8080 
Origin:http://127.0.0.1:61917 
Referer:http://127.0.0.1:61917/index.html 

我知道$httpProvider.defaults.headers.common套頭是常見的所有請求的所有請求頭,並添加默認標題是

Accept: application/json, text/plain, */*

但爲什麼我不能訪問其他請求標頭的請求uest?

如何在AngularJs中的請求攔截器方法中獲得所有這些請求標頭?

回答

0

將其他標題值看作構建請求時添加的瀏覽器設置。你可以得到一些像document.referrerwindow.navigator.userAgentwindow.navigator.language

+1

因此,我們無法在AngularJs中訪問這些標頭。我對'Accept-Language'特別感興趣,但是'navigator.language'不是讀取它的可靠選項(IE)。所以似乎沒有辦法得到它。謝謝。 – Nils 2014-09-23 07:04:59

+0

你有嘗試類似'var language = window.navigator.userLanguage || window.navigator.language;'?它也應該在IE中工作。 – 2014-09-23 13:32:51

+1

不,不工作。它使系統語言不是Internet選項>語言中的首選語言。 http://www.thecodingforums.com/threads/save-way-to-detect-browser-language.99655/ – Nils 2014-09-23 13:38:13

3

我可以回答這個問題!即使您的瀏覽器將其請求中的Accept-Language標頭髮送給服務器,但只有服務器才能讀取此標頭的值(瘋狂,對吧?)。訪問此頭的值的唯一方法是讀取服務器上的請求頭的值,然後將其發送回客戶端。

您可以將Accept-Language的值發送迴響應頭或響應正文中。

此外,某處的服務器上會出現一條線,說是這樣的:

Access-Control-Expose-Headers: "Content-Type,Origin" 

這可能有助於增加Accept-Language暴露頭的那個列表,所以它讀起來就像這樣:

Access-Control-Expose-Headers: "Content-Type,Origin,Accept-Language" 

我使用的是Accept-Language標題,而不是從window.navigator.language找出用戶的語言,因爲window.navigator.language好像經常會給出錯誤的值。

希望有幫助!