自定义标头添加到Access-Control-Request-Headers

时间:2017-01-24 12:11:15

标签: angularjs cors angular-http

我正在尝试为我的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。不确定这是否有所作为。

1 个答案:

答案 0 :(得分:4)

如果您向任何CORS-safelisted request-headers以外的脚本化跨源请求添加任何标头,它会首先触发浏览器do a CORS preflight request

没有办法阻止用户的浏览器进行CORS预检(虽然在进行测试时有办法在自己的浏览器中本地解决它;例如,使用Postman)。

因此,如果用户能够使用您的Web应用程序,使用自定义标头创建脚本化的跨源请求,那些跨源请求所需的服务器需要具有CORS感知能力。

Postman能够在不引起预检的情况下提出此类请求的原因是Postman不是浏览器引擎 - 它是一个扩展,它不受同源策略的限制,因此不需要CORS

Postman基本上可以做任何curl或其他此类工具可以做的事情,但只是为了方便而在浏览器UI中。否则它会绕过浏览器中内置的常规Web安全功能。