IE9中的跨域AJAX无法在CQ5中运行

时间:2014-11-24 18:59:04

标签: javascript jquery ajax cross-domain cq5

我需要使用jQuery AJAX发送跨域请求。但它在IE9中无效。

奇怪的是,当我在一个独立的HTML文件中尝试它时,它工作正常。但是在CQ页面中完成时会中断。

js代码如下:

 $.support.cors = true;

    $.ajax({
        cache: false,
        url: "https://www.some.external.web.service",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        type: "POST",
        crossDomain: true,
        data: "{"key":"value"}",
        processData: false,
        success: function (response) { alert("success"); },

         error: function (xhr, status, error) { alert("AJAX Error:status: "+ status+ "\nerror: " + error + "\nxhr.status: " + xhr.status + "\nResponseText: \n" + xhr.responseText);  }
        });

我尝试使用数据类型作为'jsonp',但仍无济于事。在IE9中,它永远不会返回'Success'处理程序并始终转到'error'处理程序。

显示的错误是“传输错误”。

网络服务是https,我的网页可以是http(作者)或http(发布)

我已经在ajax之前设置了$.support.cors = true;。我错过了什么?

1 个答案:

答案 0 :(得分:0)

由于GET和文本内容的原因,我无法使用JSONP或XDR。

为此,我在我的页面中添加了一个iframe,其HTML位于客户端的服务器中。因此,我们将数据发布到iframe,iframe然后将其发布到网络服务。因此,消除了跨域引用。

我们添加了双向来源检查,以确认只有授权页面向iframe发送数据和从iframe发布数据。

<iframe style="display:none;" id='receiver' name="receiver" src="https://iframe-address-at-client-server">
 </iframe>

//send data to iframe
var hiddenFrame = document.getElementById('receiver').contentWindow;
hiddenFrame.postMessage(JSON.stringify(message), 'https://client-server-url');

//The iframe receives the data using the code:
window.onload = function () {
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        var origin = e.origin;
        //if origin not in pre-defined list, break and return
        var messageFromParent = JSON.parse(e.data);
        var json = messageFromParent.data;

        //send json to web service using AJAX- same origin now  
        //return the response back to source
        e.source.postMessage(JSON.stringify(aJAXResponse), e.origin);
    }, false);
}