我正在尝试为我的angular js GET请求添加自定义标头,如下所示:
$http({
method : 'GET',
url : s,
headers : {
"partnerId" : 221,
"partnerKey" : "heeHBcntCKZwVsQo"
}
})
但问题是标题会被添加到Access-Control-Request-Headers,如下所示,我收到 403 Forbidden 响应:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0)
Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: partnerid,partnerkey
Origin: http://localhost:8080
DNT: 1
Connection: keep-alive
我也尝试过以下更改,但没有运气
return $http.get(s, {
headers : {
'partnerId' : 221,
'partnerKey': 'heeHBcntCKZwVsQo'
}
})
在SO的其他相关答案中,我看到需要在服务器端启用标头partnerId和partnerKey。但我能够在POSTMAN客户端和其他POST客户端中添加这些自定义标头,并能够获得预期的响应。所以我想我错过了一些东西。有人可以指导我这个。提前致谢
编辑:我注意到的另一件事是,在传递请求时,partnerId被替换为partnerid。不确定这是否有所作为。
答案 0 :(得分:4)
如果您向任何CORS-safelisted request-headers以外的脚本化跨源请求添加任何标头,它会首先触发浏览器do a CORS preflight request。
没有办法阻止用户的浏览器进行CORS预检(虽然在进行测试时有办法在自己的浏览器中本地解决它;例如,使用Postman)。
因此,如果用户能够使用您的Web应用程序,使用自定义标头创建脚本化的跨源请求,那些跨源请求所需的服务器需要具有CORS感知能力。
Postman能够在不引起预检的情况下提出此类请求的原因是Postman不是浏览器引擎 - 它是一个扩展,它不受同源策略的限制,因此不需要CORS
Postman基本上可以做任何curl
或其他此类工具可以做的事情,但只是为了方便而在浏览器UI中。否则它会绕过浏览器中内置的常规Web安全功能。