当ajax目标是localhost时,在IE 10和11中拒绝访问
我试图做一个互联网上的服务器(http)之间的ajax调用。 并将其指向我自己的本地主机。 FF / Chrome / ETC …的作品。 这只是一个IE问题。 即时通讯使用IE 11和10。
该请求甚至没有完成。 “拒绝访问”即刻被抛出。
这是代码。 只为你看。
在IE8和IE9中不是经典的HTTP / HTTPS错误。 这是别的,但文档没有帮助。
$jq.ajax({ contentType: 'application/json', url: url, dataType: 'json', crossDomain: true, beforeSend: function (xhr) { xhr.withCredentials = true; xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password)); }, success: function (data, status, headers) {}, error: function (xhr, status, error) {}
xhr
对象中的状态为0
,错误为“拒绝访问”
Internet Explorer引发此错误作为其安全区域function的一部分。 使用默认的安全设置时,尝试从“Internet”区域中的来源访问“本地Intranet”区域中的资源时会出现“访问被拒绝”错误。
如果您手动编写Ajax代码,则当您尝试打开资源时,Internet Explorer将引发错误。 例如:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://localhost/', true); // This line will trigger an error xhr.send();
您可以通过将原始站点添加到“可信站点”安全区域来解决此错误。 您可以通过将“http://client.cors-api.appspot.com”添加到“受信任的站点”区域,然后在test-cors.org上使用此testing页,将localhost站点用作远程URL来testing。;
除了受信任的站点要求之外,我发现问题没有解决,直到我使用相同的协议作为我的起源的请求 ,例如我的testing网站托pipe在一个HTTPS,但没有任何目的地使用HTTP(没有)。
这只适用于IE浏览器,Chrome只是有礼貌地在debugging控制台中logging警告,并不会失败。
如果您试图在IE9中进行交叉源ajax请求,则需要使用XDomainRequest
而不是XMLHttpRequest
。 有一个包装XDR的jQuery插件。 您应该知道,XDR有一些显着的限制。
另一个select是使用这样的库: https : //github.com/jpillora/xdomain 。
本文很好地解释了这个问题。 jQuery使用IE9中不支持的XMLHttpRequest
对象实现ajax调用。 您必须强制它使用XDomainRequest
。
我使用这个jQuery插件解决了这个问题:
https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
注意:
在Ajax中不要使用“ http://www.domain.xxx ”或“ http:// localhost / ”或“IP”作为URL。 只使用path(目录)和没有地址的页面名称。
错误状态:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true); AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);
真实状态:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'dir/getSecurityCode.php', true); // <<--- note AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack); function createAjax() { var ajaxHttp = null; try { if(typeof ActiveXObject == 'function') ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if(window.XMLHttpRequest) ajaxHttp = new XMLHttpRequest(); } catch(e) { alert(e.message); return null; } //------------- return ajaxHttp; };