【问题标题】:CORS with IE, XMLHttpRequest and ssl (https)带有 IE、XMLHttpRequest 和 ssl (https) 的 CORS
【发布时间】: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 框架。

公司内部的证书仅供内部使用,因此任何浏览器验证邮件都会失败,我不知道这是否与问题有关。

我希望任何人都可以解决这个问题。

非常感谢您抽出宝贵时间。

【问题讨论】:

    标签: javascript ajax internet-explorer xmlhttprequest cors


    【解决方案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。一个出色的解决方案,随着时间的流逝而被取消。
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 2013-01-21
    • 2012-02-06
    • 1970-01-01
    • 2012-09-25
    • 2012-07-08
    • 2014-10-07
    • 2014-08-30
    相关资源
    最近更新 更多