1: 什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下(同協(xié)議/同域名/同端口)的接口交互篡石。不同源的客戶端腳本在沒有明確授權的情況下,瀏覽器不能讀寫對方的資源麻养。
2: 什么是跨域越庇?跨域有幾種實現(xiàn)形式
跨域:當前執(zhí)行或加載的js文件所在頁面和該js里面請求消息的URL不同域奋隶。
跨域問題出現(xiàn)的場景:ajax請求不同域網站和iframe元素包含不同域網站。跨域請求數據悦荒,后端都是提供了數據的,是瀏覽器判斷不同域攔截了數據
解決跨域問題的方式:
- jsonp
- CORS(Cross-Origin Resource Sharing嘹吨,跨域資源共享)
- 降域
原理:主域名相同搬味,二級域名不同,將二者的document.domain
設置為主域名蟀拷,則降為同域了
使用場景:操作iframe - postMessage
不同域之間不能相互獲取數據碰纬,但是可以主動向對方發(fā)送數據,雙方各自監(jiān)聽數據问芬,然后自己決定是否使用該數據
3: JSONP 的原理是什么
實現(xiàn)基礎:html中script標簽可以引入其他域下的js悦析。利用這個特性,可實現(xiàn)跨域訪問接口此衅。需要后端支持
注:script標簽的作用强戴,就是向src指向的地址發(fā)送請求,然后該地址返回數據挡鞍,瀏覽器將得到的數據作為js去執(zhí)行
** 實現(xiàn)方式:
1.定義數據處理函數_fun
2.創(chuàng)建script
標簽骑歹,src
的地址指向后端地址,在地址最后加個參數callback=_fun
3.服務端在收到請求后墨微,解析參數道媚,計算返還數據,輸出 fun(data)
字符串翘县。
4.fun(data)
是后端返回的數據最域,作為 js執(zhí)行**,即調用fun
函數锈麸,data做為參數镀脂。
舉例:
在script里請求數據:
<script src='http://www.weather.com.cn?city=chengdu&callback=showWeather'></script>
瀏覽器加載的js里面定義如下函數:
<script>
function showWeather(json){
...
}
</script>
后端返回字符串(瀏覽器將其作為js執(zhí)行,即調用當前頁面加載js的函數showWeather
):
showWeather({
city: chengdu,
weather:{...}
})
缺點:有點復雜掐隐,不如ajax直白狗热;容易出現(xiàn)xss攻擊(獲取的數據被當作js執(zhí)行,可能會盜取本地數據等)
4: CORS是什么
CORS(Cross-Origin Resource Sharing虑省,跨域資源共享)匿刮,是一種 ajax 跨域請求資源的方式,支持現(xiàn)代瀏覽器探颈,IE支持10以上熟丸。 實現(xiàn)方式很簡單,當你使用 XMLHttpRequest 發(fā)送請求時伪节,瀏覽器發(fā)現(xiàn)該請求不符合同源策略光羞,會給該請求加一個請求頭:Origin绩鸣,后臺進行一系列處理,如果確定接受請求則在返回結果中加入一個響應頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應頭中是否包含 Origin 的值纱兑,如果有則瀏覽器會處理響應呀闻,我們就可以拿到響應數據,如果不包含瀏覽器直接駁回潜慎,這時我們無法拿到響應數據捡多。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別,代碼完全一樣铐炫。
即在服務端返給請求方的http頭部垒手,加上如下字段。瀏覽器判斷到response headers有如下字段倒信,則不會攔截不同域數據科贬。
Access-Control-Allow-Origin: 請求發(fā)起方的url 或者 *
5: 根據視頻里的講解演示三種以上跨域的解決方式
- jsonp(同上)
- cors(同上)
- 降域
二級域名間(不同域)嵌套操作時,使用document.domain = '主域名'
降域(同域) - postMessage
嵌套頁面互相發(fā)送postMessage鳖悠,同時監(jiān)聽消息window.addEventListener('message',function(e) {})