2014-09-23 48 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好像经常会给出错误的值。

希望有帮助!