Internet Explorer中跨站点请求的访问控制

时间:2010-01-11 20:29:06

标签: javascript internet-explorer cross-domain access-control

我正在尝试从几个域进行AJAX调用,以便处理请求。通过在处理服务器上设置标题,可以轻松在Firefox和Chrome中启用跨域:

header("Access-Control-Allow-Origin: *");

但这无助于在Internet Explorer中启用它。当我尝试:

httpreq.send('');

它因访问被拒绝而停止。

如何在Internet Explorer中启用它?

5 个答案:

答案 0 :(得分:12)

自从我第一次在IE7及更高版本中发布CORS解决方案以来,已经发生了很大的变化。首先,jQuery属性$ .support.cors默认为true,.NET frameworks 4.0及更高版本不再支持在3.5.1及更低版本中实现的CORS。使用ASP.NET 4.0编写Web服务时,我安装了Thinktecture.IdentityModel,它可以作为NuGet包使用。然后,在Global.asax文件的Application_Start方法中,添加:

void Application_Start(object sender, EventArgs e) 
{ 
    Thinktecture.IdentityModel.Http.Cors.IIS.UrlBasedCorsConfiguration.Configuration
        .ForResources("*")
        .ForOrigins("http://localhost:80, http://mydomain")
        .AllowAll()
        .AllowMethods("GET", "POST");
}

现在在system.webServer:

中添加httpProtocol元素
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, X-Requested-With, X-File-Name" />
    <add name="Access-Control-Allow-Methods" value="GET, POST" />
  </customHeaders>
</httpProtocol>

我的$ .ajax电话现在是:

$.ajax({
    url: serviceUrl, 
    data: JSON.stringify(postData),
    type: "POST",
    cache: false,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: onSuccess,
    error: onError
});

答案 1 :(得分:5)

我不相信你可以直接在Internet Explorer中这样做。你有几个选择:

  • 在您控制的可以转发Ajax请求的服务器上设置代理转发脚本。确保它只转发到您需要的适当目的地,这样您就不会变成匿名中继。

  • 使用document.domain技巧。基本上,您需要创建一组iframe,一个用于调用Ajax所需的每个服务器。在每个iframe内设置document.domain属性以完全匹配将Ajax请求发送到所需的域。至于如何填充必要的数据,请在设置document.domain之前使用DOM操作。请注意,此技巧要求目标服务器位于原始服务器的子域中。 this article中的更多内容,以及示例。

答案 2 :(得分:3)

我让IE8和9只使用jQuery $ .ajax(jQuery版本1.7.2)

jQuery.support.cors = true;
jQuery(function() {
$.ajax({
    crossDomain : true,
    dataType: 'html',
    //...
    });
});

答案 3 :(得分:1)

对于Internet Explorer 8,您需要对FF3执行类似操作,即使用“Access-Control-Allow-Origin”标头加上使用XDomainRequest对象而不是XMLHttpRequest。 IE8的所有内容都在这里详细解释: http://msdn.microsoft.com/en-us/library/dd573303%28VS.85%29.aspx

IE的旧版本不支持跨站点访问控制或XDomainRequest对象。 然而,它还没有结束,你可以诉诸IFrame技巧,例如创建一个不可见的IFrame来调用你的函数,如下所述: http://softwareas.com/cross-domain-communication-with-iframes

答案 4 :(得分:0)

只是添加到Eric的答案,对于旧版本的IE,您可以使用Jquery 1.4.2的$ .ajax方法,默认情况下允许跨域请求,或者对于跨域JSON,您可以使用

jQuery.getJSON(String url,Map data,Function callback)返回XMLHttpRequest

摘自Jquery文档。

“jQuery现在本身支持JSONP - 如果您尝试从远程URL加载JSON(通过$ .getJSON或$ .ajax),那么将提供额外的回调以供服务器解释。”