带有 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的兼容问题解决办法

ajax创建XMLHttpRequest对象

IE 11 错误 - 访问被拒绝 - XMLHttpRequest

二、XMLHttpRequest对象

Ajax 创建 XMLHttpRequest 对象 | AJAX 教程

IE 11、XMLHttpRequest、xhr.upload 未在 Webworker 中设置