8

我在互联网上进行了一些研究,但我没有设法获得有关该主题的完整图片。任何人都可以帮助现在和永远解决这个答案吗?

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

  • 可以使用 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>
4

3 回答 3

11

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

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

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

因此,您的服务器必须发送 aAccess-Control-Allow-Headers: Authorization以让浏览器知道可以将请求发送Authorization到服务器。如果没有此服务器标头,浏览器将仅随请求发送一些常见标头,而忽略其余标头。

于 2013-01-05T17:45:51.360 回答
1

Since "jsonp" works by creating an script tag and using the attribute src= to load resource from another domain. So I don't think there is a way to modify request headers.

于 2013-01-04T09:20:56.473 回答
0

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

于 2013-01-05T17:41:02.507 回答