1. 什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方的資源。
本域指的是?
同協議:如都是http,https,file,ssh,mailto,tel
同域名(在//后到第一個/之間):如都是http://jirengu.com/a 和http://jirengu.com/b
同端口:如都是80端口如: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://jiengu.com/main.js 和 http://jirengu.com:8080/a.php (端口不同,第一個是80)
需要注意的是: 對于當前頁面來說頁面存放的 JS 文件的域不重要,重要的是加載該 JS 頁面所在什么域
2. 什么是跨域?跨域有幾種實現形式
跨域顧名思義就是突破同源策略的限制,去不同的域下訪問數據。
主要有如下幾種實現形式:
JSONP:引入script標簽設置src所需要的資源,之后刪除。
CORS : 在后端的返回頭部設置Access-Control-Allow-Origin設置成指定的訪問地址。
降域: 2者要設置document.domain='"' 訪問的前后都要降域并且2者都要有同一個基礎域名。
passMessage : window下的一個方法,window.passMessage(值,傳遞的地址)
3. JSONP 的原理是什么
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實現數據的跨域獲取。 在同源策略下,在某個服務器下的頁面是無法獲取到該服務器以外的數據的,但img、iframe、script等標簽是個例外,這些標簽可以通過src屬性請求到其他服務器上的數據。利用script標簽的開放策略,我們可以實現跨域請求數據,當然,也需要服務端的配合。當我們正常地請求一個JSON數據的時候,服務端返回的是一串JSON類型的數據,而我們使用JSONP模式來請求數據的時候,服務端返回的是一段可執行的JavaScript代碼。
4. CORS是什么
CORS跨域資源共享,Cross-Origin-Resource-Sharing,是一種ajax跨域請求資源的方式。
1、使用XMLHttpRequest發送請求時,瀏覽器發現該請求不符合同源策略,會給該請求加一個請求頭:origin
2、后臺進行處理,確定接收請求則在返回結果中加入一個響應頭:Access-Control-Allow-Origin
3、瀏覽器判斷該響應頭中是否包含Origin的值,如果有,瀏覽器處理響應,我們拿到響應數據;如果沒有,瀏覽器直接駁回,我們無法拿到響應數據
PS:CORS的表象是讓你覺得它與同源的ajax請求沒啥區別,代碼完全一樣
使用 CORS 跨域的時候其實和普通的 ajax 過程是一樣的,只是瀏覽器在發現這是一個跨域請求的時候會自動幫我們處理一些事,比如驗證等等,所以說只要服務端提供支持,前端是不需要做額外的事情的。