1. 程式人生 > >跨域梳理

跨域梳理

res efi spa cnblogs string 動態創建 read 部分 區別

跨域技術很多,這裏做個小梳理:

CORS(跨域資源分享):

在IE8+中是通過一個XDomainRequest對象實現的,使用方法和XMLHttpRequest相似:

var xdr=new XDomainRequest();
     xdr.onload=fn;
     xdr.onerror-fn;
     xdr.open(method,url);
     xdr.send();

IE的XDR對象:

1.不傳送cookie;

2.只能設置請求頭的Content-Type

3.不能訪問響應頭部

XDR對象只支持異步請求,且返回後只能訪問responseText。

而其他瀏覽器則是通過XMLHttpRequest對象實現對CORS的支持。在操作上的唯一區別是在open()的url參數中傳入絕對路徑,可以訪問status/statusText。

1.不能用setRequestHeader()自定義頭部。

2.不發送he‘jie‘shou和接收cookie

3.調用getAllResponseHeaders()只返回空字符串。

下面一段代碼是《高級》中給出的跨瀏覽器CORS

 1 function createCORSRequest(method,url){
 2   var xhr = new XMLHttpRequest();
 3   if("withCredenticals" in xhr){
 4       xhr.open(method,url,true);
 5   }else if(typeof XDomainRequest != "undefined"){
6 xhr = new XDomainRequest(); 7 xhr.open(method,url); 8 }else{ 9 xhr=null; 10 } 11 return xhr; 12 } 13 var request=createCORSRequest(‘get‘,url); 14 if(request){ 15 request.onload=function(){}; 16 request.send(null); 17 }

最後14-17行的代碼其實是不完整的,因為IE的XDR對象在返回的時候會觸發onload事件,也就是說我們只能在onload中操作返回的responseText。但是對於其他瀏覽器則還是看readystatechange和status操作返回數據。

其他跨域技術:

圖像ping:

只能發送GET請求,無法訪問服務器的響應文本,多用在跟蹤用戶點擊頁面/動態廣告曝光次數。

1 var img=new Image();
2 img.onload=fn;
3 img.onerror=fn;
4 img.src=‘url?queryString‘

JSONP(參數式JSON):主要是兩部分,一個是callback函數,一個事作為函數參數的json數據。

JSONP的實現一般是在頁面動態創建並插入一個script標簽,且script.src=url?callback=handleresponse,這裏將一個函數名傳給服務器,服務器接到請求後返回一段代碼:

handleresponse({"name":"value"});

1.查詢字符串中callbak=handleresponse,意思是我們頁面已經有一個handleresponse函數,用來處理將要返回的數據。我們把這個函數名作為查詢字符串發給服務器。

2.服務器將要返回的json數據作為參數 傳入接收到的handleresponse函數中,並把這段代碼發回來。

3.服務器發回來的js代碼被頁面加載後,頁面立即執行:

handleresponse({"name":"value"});

Comet部分先緩一緩

跨域梳理