jsonp和跨域

1: 什么是同源策略

瀏覽器出于安全方面的考慮,只允許與本域下(同協(xié)議/同域名/同端口)的接口交互。不同源的客戶端腳本在沒有明確授權的情況下,瀏覽器不能讀寫對方的資源。

2: 什么是跨域?跨域有幾種實現(xiàn)形式
跨域:當前執(zhí)行或加載的js文件所在頁面和該js里面請求消息的URL不同域。

跨域問題出現(xiàn)的場景:ajax請求不同域網(wǎng)站和iframe元素包含不同域網(wǎng)站。跨域請求數(shù)據(jù),后端都是提供了數(shù)據(jù)的,是瀏覽器判斷不同域攔截了數(shù)據(jù)

解決跨域問題的方式:

  • jsonp
  • CORS(Cross-Origin Resource Sharing,跨域資源共享)
  • 降域
    原理:主域名相同,二級域名不同,將二者的document.domain設置為主域名,則降為同域了
    使用場景:操作iframe
  • postMessage
    不同域之間不能相互獲取數(shù)據(jù),但是可以主動向?qū)Ψ桨l(fā)送數(shù)據(jù),雙方各自監(jiān)聽數(shù)據(jù),然后自己決定是否使用該數(shù)據(jù)

3: JSONP 的原理是什么

實現(xiàn)基礎:html中script標簽可以引入其他域下的js。利用這個特性,可實現(xiàn)跨域訪問接口。需要后端支持
:script標簽的作用,就是向src指向的地址發(fā)送請求,然后該地址返回數(shù)據(jù),瀏覽器將得到的數(shù)據(jù)作為js去執(zhí)行

** 實現(xiàn)方式
1.定義數(shù)據(jù)處理函數(shù)_fun
2.創(chuàng)建script標簽,src的地址指向
后端地址,在地址最后加個參數(shù)callback=_fun
3.服務端在收到請求后,解析參數(shù),計算返還數(shù)據(jù),輸出 fun(data)
字符串
4.fun(data)是后端返回的數(shù)據(jù),
作為 js執(zhí)行**,即調(diào)用fun函數(shù),data做為參數(shù)。

舉例:
在script里請求數(shù)據(jù):

<script src='http://www.weather.com.cn?city=chengdu&callback=showWeather'></script>

瀏覽器加載的js里面定義如下函數(shù):

<script>
  function showWeather(json){
    ...
  }
</script>

后端返回字符串(瀏覽器將其作為js執(zhí)行,即調(diào)用當前頁面加載js的函數(shù)showWeather):

showWeather({
  city: chengdu,
  weather:{...}
})

缺點:有點復雜,不如ajax直白;容易出現(xiàn)xss攻擊(獲取的數(shù)據(jù)被當作js執(zhí)行,可能會盜取本地數(shù)據(jù)等)

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 的值,如果有則瀏覽器會處理響應,我們就可以拿到響應數(shù)據(jù),如果不包含瀏覽器直接駁回,這時我們無法拿到響應數(shù)據(jù)。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別,代碼完全一樣。

即在服務端返給請求方的http頭部,加上如下字段。瀏覽器判斷到response headers有如下字段,則不會攔截不同域數(shù)據(jù)。

Access-Control-Allow-Origin: 請求發(fā)起方的url  或者 *

5: 根據(jù)視頻里的講解演示三種以上跨域的解決方式

  • jsonp(同上)
  • cors(同上)
  • 降域
    二級域名間(不同域)嵌套操作時,使用document.domain = '主域名'降域(同域)
  • postMessage
    嵌套頁面互相發(fā)送postMessage,同時監(jiān)聽消息window.addEventListener('message',function(e) {})
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 1. 跨域和同源 首先來看摘自MDN上對于跨域,較為標準的解釋: 當一個資源從與該資源本身所在的服務器不同的域或端...
    曉風殘月1994閱讀 427評論 0 0
  • 1. 跨域和同源 首先來看摘自MDN上對于跨域,較為標準的解釋: 當一個資源從與該資源本身所在的服務器不同的域或端...
    曉風殘月1994閱讀 227評論 0 0
  • 1、什么是同源策略? 瀏覽器出于安全方面的考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權的情況下...
    kumabearplus閱讀 271評論 0 0
  • 什么是同源策略 同源政策(same-origin policy)是指同域名(或ip),同端口,同協(xié)議視為同一個域,...
    小囧兔閱讀 540評論 0 1
  • 亞索傳全書目錄 上一章:斷發(fā)明誓 亞索不留戀散落在地的長發(fā),也不理會嘉文四世、蓋倫將軍的挽留,牽了來時的戰(zhàn)馬離開德...
    小林呆閱讀 502評論 2 4