1.什么是同源策略
同domain(或ip),同端口,同協議視為同一個域,一個域內的腳本僅僅具有本域內的權限,可以理解為本域腳本只能讀寫本域內的資源,而無法訪問其它域的資源。這種安全限制稱為同源策略。
2.什么是跨域?跨域有幾種實現形式
概念:只要協議、域名、端口有任何一個不同,都被當作是不同的域。
URL 說明 是否允許通信
http://www.a.com/a.js
http://www.a.com/b.js 同一域名下 允許
-------------------------------
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同一域名下不同文件夾 允許
-------------------------------
http://www.a.com:8000/a.js
http://www.a.com/b.js 同一域名,不同端口 不允許
-------------------------------
http://www.a.com/a.js
https://www.a.com/b.js 同一域名,不同協議 不允許
-------------------------------
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名對應ip 不允許
------------------------------
http://www.a.com/a.js
http://script.a.com/b.js 主域相同,子域不同 不允許
-------------------------------
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二級域名(同上) 不允許(cookie這種情況下也不允許訪問)
-------------------------------
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允許
跨域實現形式:
- 通過jsonp跨域
- 通過修改document.domain來跨子域
- 使用window.name來進行跨域
- 使用HTML5的window.postMessage方法跨域
3.JSONP 的原理是什么
XMLHttpRequest
不能跨域,但是<script>
標簽的src可以跨域,所以jsonp正是利用這個特性來實現的.當需要通訊時,本站腳本創建一個<script>元素,地址指向第三方的API網址,并提供一個回調函數來接收數據(函數名可約定,或通過地址參數傳遞),第三方產生的響應為json數據的包裝(故稱之為jsonp,即json padding),形如:callback({"name":"hax","gender":"Male"})
。這樣瀏覽器會調用callback函數,并傳遞解析后json對象作為參數。本站腳本可在callback函數里處理所傳入的數據。
<script type="text/javascript">
function dosomething(jsondata){
//處理獲得的json數據
}
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>
js文件載入成功后會執行我們在url參數中指定的函數,并且會把我們需要的json數據作為參數傳入。所以jsonp是需要服務器端的頁面進行相應的配合的。
4. CORS是什么
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。CORS需要瀏覽器和服務器同時支持。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。
因此,實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。