同源策略(same-origin policy)及三種跨域方法
1.同源策略
含義:
同源是指文檔的來源相同,主要包括三個方面
- 協議
- 主機
- 載入文檔的URL端口
所以同源策略就是指腳本只能讀取和所屬文檔來源相同的窗口和文檔的屬性這樣一個規定。
同源策略目的:
一項政策的頒布肯定事出有因,所以同源策略也不例外,主要是出於安全性考慮,比如可以防止惡意腳本讀取內容
注意:
同源策略限制的是腳本嵌入的文本來源,而不是腳本本身,理解這點特別重要。比如B主機可以通過使用(<script>
標簽的src)屬性加載A主機的腳本,但是卻不可以載入A主機的文檔,這就是同源策略發揮作用了。
限制范圍
非同源,共有三種行為受到限制。
(1) Cookie、LocalStorage 和 IndexDB 無法讀取。
(2) DOM 無法獲得。
(3) AJAX 請求不能發送。
雖然這些限制是必要的,但是有時很不方便,合理的用途也受到影響。
2.三種跨域方法
(1)設置document.domain
比如home.example.com要讀取developer.example.com里面的文檔,由於同源策略的限制,就無法讀取,我們通過設置document.domain="example.com";這時就不再受同源策略的限制了。
(2)誇資源共享CORS(Cross-origin resource sharing)
CORS采用新的“origin:”請求頭和新的Access-Control-Allow-Origin響應頭來擴展HTTP。它允許服務器用頭信息顯示地列出源,或使用通配符來匹配所有的源並允許任何地址請求文件。
因此,實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。
從而它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,克服了AJAX只能同源使用的限制。
(3)跨文檔消息(cross-document messaging)
允許來自一個文檔的腳本可以傳遞消息到另一個文檔里的腳本,而不管腳本的來源是否不同,通過調用window.postMessage()方法,可以異步傳遞消息事件(可以使用onmessage事件處理程序函數來處理它)到窗口的文檔里。
參考:
1.javascript權威指南