带有 IE、XMLHttpRequest 和 ssl (https) 的 CORS
Posted
技术标签:
【中文标题】带有 IE、XMLHttpRequest 和 ssl (https) 的 CORS【英文标题】:CORS with IE, XMLHttpRequest and ssl (https) 【发布时间】:2013-03-04 17:47:10 【问题描述】:我的应用程序通过 Ajax 进行通信以使用来自另一台服务器的一些安静的服务时遇到问题。
问题接缝仅出现在 IE 上,当使用应用程序位于具有 ssl 的服务器中时,我的意思是当我从其他机器使用来自同一服务器的相同服务时,一切正常。
我在具有 SSL 的服务器 (https://api.restbla/..) 上有 Restful 服务 我必须从其他服务器上使用这些(有或没有 ssl 证书)
用 Internet Explorer 测试我得到了结果:
如果我使用本地工作的服务 如果我从同一个盒子(restful 在 托管)作品 如果我在没有 ssl 的情况下使用另一台服务器的服务 但是当我在 https 上使用服务器上的服务时,无法正常工作 IE。之前的所有测试都适用于 Chrome 和 FF
这是我用来进行 ajax 调用的 javascript
function load(_url, _callback, _params, _type, _htmlMethod, _onStartFunction, _onFinishFunction)
var xhr;
if (isFunction(_onStartFunction)) _onStartFunction();
ieVersion = getInternetExplorerVersion();
if (typeof XMLHttpRequest !== 'undefined')
console.log("XMLHttpRequest");
xhr = new XMLHttpRequest();
else
if (ieVersion > 7)
console.log("XDomainRequest");
xhr = new XDomainRequest();
else
var versions = [ "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XmlHttp" ];
for ( var i = 0, len = versions.length; i < len; i++)
try
console.log("ActiveXObject: " + versions[i]);
xhr = new ActiveXObject(versions[i]);
break;
catch (e) /* attempt next one*/
xhr.onreadystatechange = ensureReadiness;
if (_type == JSON_TYPE)
contentType = "application/json";
else
contentType = 'text/plain';
function ensureReadiness()
if (xhr.readyState < 4) return;
if (xhr.status !== 200)
showServiceDown();
if (isFunction(_onFinishFunction)) _onFinishFunction();
return;
if (xhr.readyState === 4)
if (isFunction(_onFinishFunction)) _onFinishFunction();
var responseText = "";
responseText = xhr.responseText;
if (_type == JSON_TYPE)
_callback(responseText);
else if (_type = HTML_TYPE)
var replaced = responseText.replace(/\\/g, '///');
_callback(replaced);
else _callback(responseText);
if ((_htmlMethod == undefined) || (_htmlMethod == null) || (_htmlMethod == ""))
_htmlMethod = METHOD_POST;
xhr.open(_htmlMethod, _url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("Content-type", contentType);
_params = (_params != undefined) ? _params : null;
xhr.send(_params);
我不能为这个项目使用任何 javascript 框架。
公司内部的证书仅供内部使用,因此任何浏览器验证邮件都会失败,我不知道这是否与问题有关。
我希望任何人都可以解决这个问题。
非常感谢您抽出宝贵时间。
【问题讨论】:
【参考方案1】:我有一个类似的问题,通过在 IE 案例中向 XDomainRequest 添加一个虚拟的onprogress
回调来解决:
if (ieVersion > 7)
console.log("XDomainRequest");
xhr = new XDomainRequest();
xhr.onprogress = function() ; // <-- add this
如果没有定义 onprogess
处理程序,IE 似乎正在中止跨域请求。
这是我用于 AJAX 的一个函数,也许它对你有帮助:
/**
* Wraps jQuery's AJAX, adds X-Domain support for IE
*
*
*/
function xDomainAJAX (url, settings)
jQueryRequired();
$.support.cors = true; // enable x-domain
if ($.browser.msie && parseInt($.browser.version, 10) >= 8 && XDomainRequest)
// use ms xdr
var xdr = new XDomainRequest();
xdr.open(settings.type, url + '?' + $.param(settings.data));
xdr.onprogress = function() ;
xdr.onload = function()
settings.success(xdr.responseText);
;
xdr.onerror = settings.error;
xdr.send();
else
// use jQuery ajax
$.ajax(url, settings);
【讨论】:
我已经尝试过了,但也没有用:S.. 我注意到在 Internet Explorer 属性-> 安全性-> 安全设置中,我选择跨域访问数据源作为启用,.. 它适用于 IE .. @cesaregb 我添加了一个过去对我有用的代码示例 ye 实际上有效.. 为 IE 使用 XDomainRequest 并添加 onprogress 和 onload 侦听器...该死的 IE 非常感谢 我喜欢这个,但它不起作用。它在 xdr.open 失败。我的想法是它不喜欢身份验证?我最终 ping:https:mysite.mydomain.com/something/foo 设置 type="GET", header:Authentication: "Basic 2nms8i23g8-", success:function(), error:function() ,数据: 它只是说:IE CORS 请求的访问被拒绝。 值得注意的是,因为我研究了一个类似的问题(这并不是在他们编写它时反驳 paislee)XDR 不再在 IE11 中实现,并且 $.browser 也不再包含在jQuery。一个出色的解决方案,随着时间的流逝而被取消。以上是关于带有 IE、XMLHttpRequest 和 ssl (https) 的 CORS的主要内容,如果未能解决你的问题,请参考以下文章
创建 XMLHttpRequest 对象时IE的兼容问题解决办法
IE 11 错误 - 访问被拒绝 - XMLHttpRequest