我可以在跨域json请求中设置标头吗?

时间:2013-01-04 08:24:20

标签: javascript json http-headers cross-domain oauth-2.0

我在互联网上做了一些研究,但我没有设法得到关于这个主题的完整图片。现在和永远都可以帮助解决这个问题吗?

这是我到目前为止所发现的:

  • 可以使用jsonp进行跨域调用。绝不允许在jsonp调用中更改标题
  • 如果服务器允许,可以使用json进行跨域调用。

这就是我想要做的事情:

$.ajax({
    type: "GET",
    crossDomain: true,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Bearer " + ($("#accesstoken").val()));
    },
    contentType: "application/json; charset=utf-8",
    url: myJSonServer + encodeURI(operation),
    dataType: 'json',
    cache: false,
    success: callback,
    error: function (jqXhr, textStatus, errorThrown) { alert(textStatus + ": " + errorThrown); }
});

这就是发生的事情:

  • 当myJSonServer位于同一个域时,根本没有问题
  • 当myJSonServer在另一个域上时,请求被发送,但没有Bearer标题

此Bearer标头是oAuth2标准的一部分。

我知道这可能不是最好的解决方案,在浏览器中设置accessToken。而且我知道我可以在这种情况下使用代理。

我只是好奇是否可以在跨域json请求中设置标头?
感谢

- 问题解决了

我正在使用MVC4并在web.config中添加了crossDomainScriptAccessEnabled =“true”。我认为这就足够了,但是apsillers的答案解决了我的问题。我现在已经在web.config中添加了这个:

 <system.webServer>
     <httpProtocol>
         <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Authorization" />
         </customHeaders>
      </httpProtocol>
   </system.webServer>

3 个答案:

答案 0 :(得分:11)

使用JSONP,无法设置自定义标头。

使用CORS,服务器必须发送Access-Control-Allow-Headers标头以允许来自客户端的不常见请求标头。来自HTML5 Rocks CORS page

  

Access-Control-Allow-Headers ... - 支持的请求标头的逗号分隔列表。

因此,您的服务器必须发送Access-Control-Allow-Headers: Authorization,让浏览器知道允许将Authorization发送到带有请求的服务器。如果没有此服务器标头,浏览器将只发送一些带有请求的公共标头,而忽略其余标头。

答案 1 :(得分:1)

由于“jsonp”的工作原理是创建脚本标记并使用属性src=从另一个域加载资源。所以我认为没有办法修改请求标头。

答案 2 :(得分:0)

如果您使用JSONP进行跨源请求 - 那么答案是否定的,您不能在此类请求上设置HTTP标头。 如果您使用CORS进行跨源请求 - 那么答案是肯定的,因为您使用普通XHR来发出请求:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing