如何解決跨域問題

什么是跨域?

跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。

什么是同源策略?
  • 同源定義
    源=協(xié)議+域名+端口號(window.origin或location.origin可以得到當(dāng)前源)
    同源:如果兩個url的協(xié)議、域名、端口號完全一致,那么這兩個url就是同源的。
    例如:
https://qq.com
https://www.qq.com

這兩者就不是同源的,完全一致的才算同源。

  • 同源策略(不同源的頁面之間,不準(zhǔn)互相訪問數(shù)據(jù))
    瀏覽器規(guī)定如果JS運(yùn)行在源A里,那么就只能獲取源A的數(shù)據(jù),不能獲取源B的數(shù)據(jù),即不允許跨域。
    例如(此處省略http協(xié)議):假設(shè)frank.com/index.html引用了cdn.com/1.js,則可以說1.js運(yùn)行在源frank.com里(注意這跟cdn.com沒有關(guān)系,雖然1.js從它那里下載)所以可以看出來1.js就只能獲取frank.com的數(shù)據(jù),不能獲取1.frank.com的數(shù)據(jù)。

  • 這么做的目的是什么?
    為了保護(hù)用戶隱私。

怎么跨域?
  • 問題根源
    1、瀏覽器默認(rèn)不同源之間不能互相訪問數(shù)據(jù)
    2、但是qq.com和frank.com其實(shí)都是自己的網(wǎng)站
    3、我想讓兩個網(wǎng)站互相訪問,瀏覽器為什么要組織
解法一 用CORS

如果要共享數(shù)據(jù),需要提前聲明,如何聲明呢?
具體語法

Access-Control-Allow-Origin:(允許訪問的網(wǎng)址)

詳情參考:(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)

解法二 JSONP

(主要是用來兼容IE的)
客戶端在 HTML 中動態(tài)生成 script 標(biāo)簽,在 “src” 中引入請求的 URL + 回調(diào)函數(shù),這樣請求服務(wù)器返回的數(shù)據(jù)會交由回調(diào)函數(shù)處理,這樣就實(shí)現(xiàn)了跨域讀請求;服務(wù)端在接收到客戶端請求后,首先取得客戶端要回調(diào)的函數(shù)名,再生成 JavaScript 代碼段返回給瀏覽器,瀏覽器在獲取到返回結(jié)果后直接調(diào)用回調(diào)函數(shù)完成任務(wù)。

  • 例如frank.com訪問qq.com
    1、qq.com將數(shù)據(jù)寫到/frank.js
    2、frank.com用script標(biāo)簽引用/frank.js
    3、/frank.js執(zhí)行,執(zhí)行什么呢?
    4、frank.com事先定義好window.xxx函數(shù)
    5、/frank.js執(zhí)行window.xxx({frinds:[....]})
    6、然后frank.com就通過window.xxx獲取到數(shù)據(jù)了
    (window.xxx就是一個回調(diào))
擴(kuò)展

為什么可以跨域使用CSS、JS和圖片等?
同源策略限制的是數(shù)據(jù)訪問,我們引用CSS、JS和圖片的時候,其實(shí)并不知道其內(nèi)容,我們只是在引用。(如果可以跨域使用的話那你知道CSS的第一個字符是什么嗎?)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容