題目1: 什么是同源策略
-
同源策略(Same origin Policy)
瀏覽器出于安全方面的考慮咕村,只允許與本域下的接口交互痹栖。不同源的客戶端腳本在沒有明確授權(quán)的情況下斩个,不能讀寫對方的資源。 -
本域指的是檐薯?
同協(xié)議:如都是http或者h(yuǎn)ttps
同域名:如都是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 (協(xié)議不同)
http://jirengu.com/main.js 和 http://bbs.jirengu.com/a.php (域名不同衰絮,域名必須完全相同才可以)
http://jiengu.com/main.js 和 http://jirengu.com:8080/a.php (端口不同,第一個是80)
題目2: 什么是跨域袍冷?跨域有幾種實現(xiàn)形式
- 跨域就是實現(xiàn)讓一個域名訪問另一個不是本域里面的數(shù)據(jù)。
- 實現(xiàn)方式
- JSONP
- CORS
- postMessage
- 降域
題目3: JSONP 的原理是什么
- 網(wǎng)頁通過添加一個<script>元素猫牡,向服務(wù)器請求JSON數(shù)據(jù)胡诗,這種做法不受同源政策限制;服務(wù)器收到請求后,將數(shù)據(jù)放在一個指定名字的回調(diào)函數(shù)里傳回來乃戈。JSONP 需要對應(yīng)接口的后端的配合才能實現(xiàn)褂痰。
但是JSONP只能發(fā)送‘get’請求。
例如頁面發(fā)送了一個下方的script請求:
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>
- 這個請求到達(dá)后端后症虑,后端會去解析callback這個參數(shù)獲取到字符串showData缩歪,在發(fā)送數(shù)據(jù)做如下處理:
之前后端返回數(shù)據(jù): {"city": "hangzhou", "weather": "晴天"} 現(xiàn)在后端返回數(shù)據(jù): showData({"city": "hangzhou", "weather": "晴天"}) 前端script標(biāo)簽在加載數(shù)據(jù)后會把 「showData({“city”: “hangzhou”, “weather”: “晴天”})」做為 js 來執(zhí)行,這實際上就是調(diào)用showData這個函數(shù)谍憔,同時參數(shù)是 {“city”: “hangzhou”, “weather”: “晴天”}匪蝙。 用戶只需要在加載提前在頁面定義好showData這個全局函數(shù),在函數(shù)內(nèi)部處理參數(shù)即可习贫。
題目4: CORS是什么
- CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing)逛球,是一種 ajax 跨域請求資源的方式,支持現(xiàn)代瀏覽器苫昌,IE支持10以上颤绕。 實現(xiàn)方式很簡單,當(dāng)你使用 XMLHttpRequest 發(fā)送請求時祟身,瀏覽器發(fā)現(xiàn)該請求不符合同源策略奥务,會給該請求加一個請求頭:Origin,后臺進(jìn)行一系列處理袜硫,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值氯葬,如果有則瀏覽器會處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)婉陷,如果不包含瀏覽器直接駁回帚称,這時我們無法拿到響應(yīng)數(shù)據(jù)。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別秽澳,代碼完全一樣闯睹。