2014-11-24 73 views
0

我需要使用jQuery AJAX發送跨域請求。但它在IE9中不起作用。IE9中的跨域AJAX無法在CQ5中工作

奇怪的是,當我在獨立的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中,它永遠不會返回'成功'處理程序,並總是進入'錯誤'處理程序。

顯示的錯誤是'運輸錯誤'。

WebService的是HTTPS和我的網頁可以是HTTP(作者)或HTTP(發佈)

我已經有阿賈克斯前$.support.cors = true;集。我錯過了什麼?

+1

什麼是錯誤?你是否從https轉到http? – epascarello 2014-11-24 19:00:20

+0

'data:「{key:」+ value +「}」'? (剛剛看到) – l2aelba 2014-11-24 19:01:15

+0

更新了問題。 JSON數據不是問題。錯誤是'Transport Error',服務是https,而我的頁面可以是http或https – 2014-11-24 19:09:21

回答

0

因爲GET和文本內容,我無法分別使用JSONP或XDR。

爲此,我在我的頁面中添加了一個iframe,其HTML位於客戶端的服務器中。因此,我們將數據發佈到iframe,然後iframe將其發佈到web服務。因此消除了跨域引用。

我們已經添加了雙向來源檢查,以確認只有經過授權的頁面發佈數據往返於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); 
}