XDomainRequest之IE8和IE9發(fā)送跨域請求拒絕訪問解決方法
IE8和IE9跨域請求“拒絕訪問”
頁面中偶爾會有跨域的需求,之前使用過jsonp格式的,但是這次后端提供了可以跨域訪問的接口。
接口表現(xiàn)如下:
1、在谷歌瀏覽器和火狐瀏覽器上正常
2、在IE10及以上瀏覽器上正常
3、在IE9和IE8瀏覽器上請求發(fā)送了,但是后端接口接收不到請求記錄,在【網(wǎng)絡】面板上也查詢不到接口發(fā)送記錄
在IE9和IE8瀏覽器上經(jīng)過打斷點調(diào)試,發(fā)現(xiàn)是請求send()之后,立馬被瀏覽器拋出異常“拒絕訪問”
function _http(_url, _method, _data, _async, _success, _err) { try { // 1.創(chuàng)建XMLHttpRequest對象 var xhr = null; xhr = new XMLHttpRequest(); // 2.打開與服務器的鏈接 xhr.open(_method, _url, _async); // 設置請求頭參數(shù)格式 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8"); // 3.響應就緒 xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { var response = JSON.parse(xhr.responseText); _success && _success(response ) } else { _err && _err(e) } } } ; // 4.發(fā)送給服務器 xhr.send(_data) } catch (e) {// 捕獲異常 console.log(e) _err && _err(e) } }
看來在IE8和IE9上使用XMLHttpRequest發(fā)送跨域請求是有問題的。
在MDN上搜索了一下,官方文檔上描述IE8和IE9發(fā)送跨域請求使用XDomainRequest,IE10及以上可以直接使用XMLHttpRequest
XDomainRequestMDN鏈接如下
微軟官網(wǎng)的XDomainRequestMDN使用文章
微軟XDomainRequest文章的翻譯
以下是該方法的使用方法
// 創(chuàng)建跨域請求對象
var xdr = new XDomainRequest()
xdr對象含有的方法如下
XDomainRequest原型鏈上的方法如下
// 設置超時時間
xdr.timeout = 5000
//請求報頭Content-Type,可以設置,但是獲取的時候始終為""
xdr.contentType
// 讀取超時時間
xdr.timeout
// 超時事件
xdr.ontimeout = function () {};
// 請求異常事件
xdr.onload = function () {};
// 請求完成事件
xdr.onload = function () {};
// 請求進度事件
xdr.onprogress = function () {};
//接口的響應數(shù)據(jù)(只讀,雖然可以設置,但是設置的值不生效)
xdr.responseText
// 與服務器建立連接,只支持get 和 post 請求,XDomainRequest為異步請求,不支持設置同步還是異步
// http的頁面只能使用http接口,https頁面只能使用https接口
xdr.open(method, url);
// 發(fā)送請求,為避免兩個請求相隔時間太近沒有響應,使用setTimeout 執(zhí)行
setTimeout(function () {
xdr.send(_data);
}, 0);
// 中斷請求
xdr.abort();
function _xdrhttp(_url, _method, _data, _success, _err) { try { // 創(chuàng)建跨域請求對象 var xdr = new XDomainRequest() , timer = null; // 設置超時時間為5s xdr.timeout = 5000 xdr.ontimeout = function() { xdrError('操作失敗,請求超時。') } ; xdr.onerror = function(e) { xdrError('操作失敗,請安裝驅(qū)動程序后重試。') } ; xdr.onload = function() { var response = JSON.parse(xdr.responseText); _success && _success(response); } // 2.打開與服務器的鏈接 xdr.open(_method, _url); setTimeout(function() { // 發(fā)送請求 xdr.send(_data); }, 0); } catch (e) { xdrError('操作失敗,請安裝驅(qū)動程序后重試。') } // 統(tǒng)一的錯誤處理方法 function xdrError(msg) { _err && _err({ status: 500, message: msg, ret: 'fail' }); } }
使用XDomainRequest發(fā)送請求返回結(jié)果
問題解決,皆大歡喜
在附一個已經(jīng)封裝好的 jQuery-ajaxTransport-XDomainRequest 插件鏈接
具體的使用可以參考下一篇文章。
相關文章
如何使用工具規(guī)范前端項目的commits與changelog技巧
這篇文章主要為大家介紹了如何使用工具規(guī)范前端項目的commits與changelog技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02基于Ionic3實現(xiàn)選項卡切換并重新加載echarts
這篇文章主要介紹了基于Ionic3實現(xiàn)選項卡切換并重新加載echarts,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09