題目1: 什么是同源策略
瀏覽器出于安全方面考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方的資源。
如:
-
http://jirengu.com/a/b/js
和http://jirengu.com/index.php
(同源)
不同源的例子:
-
http://jirengu.com/main.js
和https://jirengu.com/a.php
(協議不同) -
http://jirengu.com/main.js
和http://bbs.jirengu.com/a.php
(域名不同,域名必須完全相同) -
http://jirengu.com/main.js
和http://jirengu.com:8080/a.php
(端口不同,第一個是80)
對于當前頁面來說,頁面存放的JS文件的域不重要,重要的是加載該JS的頁面在什么域。
題目2: 什么是跨域?跨域有幾種實現形式
簡單地理解就是因為JavaScript同源策略的限制,a.com 域名下的js無法操作b.com或是c.a.com域名下的對象。更詳細的說明看下表:
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
- CORS
- 降域
- postMessage
題目3: JSONP 的原理是什么
當需要通訊時,本站腳本創建一個<script>元素,地址指向第三方的API網址,形如: <script src="http://www.example.net/api?param1=1¶m2=2"></script> 并提供一個回調函數來接收數據(函數名可約定,或通過地址參數傳遞)。 第三方產生的響應為json數據的包裝(故稱之為jsonp,即json padding),形如: callback({"name":"hax","gender":"Male"}) 這樣瀏覽器會調用callback函數,并傳遞解析后json對象作為參數。本站腳本可在callback函數里處理所傳入的數據。
題目4: CORS是什么
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請求資源的方式,支持現代瀏覽器,IE支持10以上。 當使用 XMLHttpRequest 發送請求時,瀏覽器發現該請求不符合同源策略,會給該請求加一個請求頭:Origin,后臺進行一系列處理,如果確定接受請求則在返回結果中加入一個響應頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應頭中是否包含 Origin 的值,如果有則瀏覽器會處理響應,我們就可以拿到響應數據,如果不包含瀏覽器直接駁回,這時我們無法拿到響應數據。
題目5: 根據視頻里的講解演示三種以上跨域的解決方式
當這兩個域名都屬于同一個基礎域名并且所用的協議、端口都一致的時候,可以使用降域來實現跨域
例:
//頁面A的URL: http://a.jirengu.com/a.html
window.domain = jirengu.com
//頁面B的URL: http://b.jirengu.com/a.html
window.domain = jirengu.com