瀏覽器跨域問題解決方案彙總

本文在參考大神的文章基礎上,簡略地做了總結,關於瀏覽器跨域問題的幾種方案,便於自己在以後工作學習過程查閱,只是概念和方案的概覽,詳細實踐方案可以參考原文鏈接,或百度、google具體實現。在此,感謝大神們的貢獻。


1.爲什麼會有瀏覽器跨域問題

出於安全性考慮,各個瀏覽器廠商,實現了同一域名下,不能訪問別的域名下的腳本,cookie等等,即:同源策略;但是,實際開發中又不可避免,在同一域名下訪問其他域名下的資源,所以,就產生了瀏覽器跨域問題的解決方案。

2.域的理解

只有,協議,域名,端口號,三者都相同,才能算是同一個域,否則,都是不同域。

3.什麼是同源策略

通俗的講,同一域名下的資源是可以互相訪問的,不同域名下的資源是不可以訪問的;同源策略的目的是爲了保證用戶信息的安全。防止惡意的網站盜取數據。目前,如果非同源,共有三種行爲受到限制。
(1)Cookie、LocalStorage和IndexDB無法獲取。
(2)DOM無法獲得。
(3)AJAX請求不能發送。

4. 常見幾種解決瀏覽器跨域方案

(1) document.domain+iframe的解決方案(僅適用於,主域名相同的場景)
(2) 通過script元素的src屬性,不受同源策略的限制,可以訪問不同域的腳本特性。
(3) location.hash + iframe
(4) window.name + iframe

window.name 的美妙之處:name 值在不同的頁面(甚至不同域名)加載後依舊存在,並且可以支持非常長的 name 值(2MB)。

(5) postMessage(HTML5中的XMLHttpRequest Level 2中的API)

<iframe id="ifr" src="b.com/index.html"></iframe>
<script type="text/javascript">
window.onload = function() {
    var ifr = document.getElementById('ifr');
    var targetOrigin = 'http://b.com';  // 若寫成'http://b.com/c/proxy.html'效果一樣
                                        // 若寫成'http://c.com'就不會執行postMessage了
    ifr.contentWindow.postMessage('I was there!', targetOrigin);
};
</script>

(6) CORS
CORS背後的思想,就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功,還是應該失敗。
(7) Ajax的jsonp技術實現
(8) web sockets

web sockets是一種瀏覽器的API,它的目標是在一個單獨的持久連接上提供全雙工、雙向通信。(同源策略對web sockets不適用)
web sockets原理:在js創建了web socket之後,會有一個HTTP請求發送到瀏覽器以發起連接。取得服務器響應後,建立的連接會使用HTTP升級從HTTP協議交換爲web sockt協議。
只有在支持web socket協議的服務器上才能正常工作。
var socket = new WebSockt('ws://www.baidu.com');//http->ws; https->wss
socket.send('hello WebSockt');
socket.onmessage = function(event){
var data = event.data;
}

(9)服務器端實現
服務器端對於CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,就可以允許Ajax進行跨域的訪問。

  1. 參考文章1

  2. 參考文章2

  3. 參考文章3
  4. 參考文章4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章