首先介紹(同源策略)
同源策略是瀏覽器最核心且基本的安全約定,要求協議、域名、端口都相同為同源,如果非同源時請求數據瀏覽器會在控制台拋出跨域異常錯誤,同源策略是瀏覽器的行為,即使客戶端請求發送了,服務端也響應了,但是會攔截,瀏覽器無法接收到響應數據,保證了數據的安全,避免XSS攻擊
跨域的解決辦法:
一:document.domain設置
兩個不同的源(子域等情況)可以通過設置document.domain告訴瀏覽器它們是同一個源,想要實現它們兩個之間的通信兩個都需要設置相同的document.domain
缺點:
用於父域和子域的情況;存在安全性問題,如果其中一個被攻擊,另一個也會引起安全問題;適用范圍為cookie共享或iframe使用(獲取DOM等);
二:JSONP
原理:動態創建script標簽,向服務器發送請求,設置script標簽src屬性后接callback=回調函數,回調函數名與響應一致,響應成功觸發回調函數獲取響應的數據
缺點:
存在安全問題,需要進一步做安全驗證如token等信息;請求方式只能為get請求;
三:CORS
跨域資源共享,設置響應頭,允許某個域或全部向服務器發送請求(Access-Control-Allow-Origin: '*')無請求方法限制
四:HTML5新增的window.postMessage API
允許跨窗口通信,無同源限制,postMessage(data, origin)參數一為通信內容,參數二為接收通信的窗口可以為*(所有),然后通過window.addEventListener('message', function(e){})監聽message事件,e有三個屬性值e.source:發送信息的窗口,e.origin:接收信息的窗口,e.data:通信的內容
五:window.name
只要在同一個窗口,無同源限制,可以通過window.name通信,window.name值長無限制,但須監聽window.name值變化,影響應用性能
六:location.hash
即url#后面的片段,可以通過window.onhashchange方法監聽獲取通信內容
七:websocket
websocket通信協議采用ws://(非加密)wss://(加密)作為協議前綴,無同源限制,服務器可以通過驗證請求頭的origin實現通信
前端使用window.onerror事件捕獲js腳本錯誤信息,當前端通過script標簽加載跨域資源時window.onerror無法獲取這些資源中的報錯信息,會得到script error,無法知道具體錯誤,通過設置script標簽的crossorigin屬性就可以捕獲到跨域資源的具體報錯信息,對於通過CDN引入js時很有幫助
也需要請求的跨域資源設置Access-Control-Allow-Origin的響應頭,不然無法訪問該資源