摘要:關(guān)于跨域,個人總結(jié)了以下幾種方法其中等方法常用,的方法既不復(fù)雜,也能兼容到幾乎所有瀏覽器,這真是極好的一種跨域方法。這個主要針對跨域訪問的情況兩個網(wǎng)頁一級域名相同,只是二級域名不同,瀏覽器允許通過設(shè)置共享。
關(guān)于跨域,個人總結(jié)了以下幾種方法
JSONP
CORS
WebSocket
document.domain
window.name
location.hash
postMessage
其中:CORS、jsonp等方法常用,window.name的方法既不復(fù)雜,也能兼容到幾乎所有瀏覽器,這真是極好的一種跨域方法。
webSocketWebSocket是一種在單個TCP連接上進行全雙工通訊的協(xié)議。WebSocket與HTTP協(xié)議其實兩者的關(guān)系像是兩兄弟,各自有著各自擅長的領(lǐng)域,而且時不時還一同協(xié)作解決難題。
WebSocket要解決的問題:當(dāng)服務(wù)器資源到位時,能夠主動通知瀏覽器并返回相應(yīng)資源。HTML5標(biāo)準(zhǔn)推出了WebSocket協(xié)議。
本身就不受瀏覽器“同源策略”的限制,WebSocket協(xié)議下的通訊機制,客戶端和服務(wù)端一旦建立連接,就可以順暢的互發(fā)數(shù)據(jù),因此WebSocket協(xié)議本身就是“有狀態(tài)的”,不需要Cookie的幫忙,既然沒有Cookie,自然也不需要“同源策略”去保護。
下面來說說webSocket的具體實現(xiàn):
像發(fā)起AJAX請求一樣,發(fā)起WebSocket請求需要借助瀏覽器提供的WebSocket對象,該對象提供了用于創(chuàng)建和管理WebSocket連接,以及通過該連接收發(fā)數(shù)據(jù)的API。所有的瀏覽器都默認(rèn)提供了WebSocket對象。讓我們看看該對象的用法:
和使用XHRHttpRequest對象一樣,我們首先要實例化一個WebSocket對象:
傳入的參數(shù)為響應(yīng)WebSocket請求的地址。
同樣類似AJAX的是,WebSocket對象也有一個readyState屬性,用來表示對象實例當(dāng)前所處的鏈接狀態(tài),有四個值:
0:表示正在連接中(CONNECTING);
1:表示連接成功,可以通信(OPEN);
2:表示連接正在關(guān)閉(CLOSING);
3:表示連接已經(jīng)關(guān)閉或打開連接失?。–LOSED);
我們可以通過判斷這個值來執(zhí)行我們相應(yīng)的代碼。
除此之外,WebSocket對象還提供給我們一系列事件屬性,使我們控制連接過程中的通信行為:
onopen:用于指定連接成功后的回調(diào)函數(shù);
onclose:用于指定連接關(guān)閉后的回調(diào)函數(shù);
onmessage:用于指定收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù);
onerror:用于指定報錯時的回調(diào)函數(shù);
通過.send()方法,我們擁有了向服務(wù)器發(fā)送數(shù)據(jù)的能力(WebSocket還允許我們發(fā)送二進制數(shù)據(jù))。
如何知道何時我們的數(shù)據(jù)發(fā)送完畢呢?我們需要使用WebSocket對象的bufferedAmount屬性,該屬性的返回值表示了還有多少字節(jié)的二進制數(shù)據(jù)沒有發(fā)送出去,所以我們可以通過判斷該值是否為0而確定數(shù)據(jù)是否發(fā)送結(jié)束。
CORS阮一峰博客http://www.ruanyifeng.com/blo...
在http header中寫入允許訪問的域名。
Access-Control-Allow-Origin,該字段是必須的。它的值要么是請求時Origin字段的值,要么是一個*,表示接受任意域名的請求。
需要注意的是:CORS請求默認(rèn)情況下是不會發(fā)送cookie的,所以需要在服務(wù)器的響應(yīng)中設(shè)置:
Access-Control-Allow-Credentials: true
除此之外,還需要在AJAX請求中設(shè)置:
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
CORS請求分為簡單請求和非簡單請求:
簡單請求:需要AJAX里的onerrer回調(diào)函數(shù)進行捕獲,因為也可能會返回200。
非簡單請求:瀏覽器先詢問服務(wù)器,當(dāng)前網(wǎng)頁所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復(fù),瀏覽器才會發(fā)出正式的XMLHttpRequest請求,否則就報錯。
會首先發(fā)送一個預(yù)檢請求,請求方法為:options,并且在請求頭中會包含相應(yīng)字段:
Access-Control-Request-Method
Access-Control-Request-Headers
如果響應(yīng)頭中有CORS相關(guān)字段:
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
瀏覽器檢查響應(yīng)頭中包含這三個字段,則預(yù)檢請求成功;否則,則會拋出錯誤。一旦服務(wù)器通過了"預(yù)檢"請求,以后每次瀏覽器正常的CORS請求,就都跟簡單請求一樣,會有一個Origin頭信息字段。服務(wù)器的回應(yīng),也都會有一個Access-Control-Allow-Origin頭信息字段。
我們發(fā)現(xiàn),Web頁面上調(diào)用js文件時則不受是否跨域的影響(不僅如此,我們還發(fā)現(xiàn)凡是擁有”src”這個屬性的標(biāo)簽都擁有跨域的能力,比如