理解跨域及解決原理

是誰(shuí)引起的跨域?

跨域是瀏覽器(瀏覽器內(nèi)核)的安全檢測(cè)行為而并非是服務(wù)器端行為。
真正跨域作用的地方在于瀏覽器接收到服務(wù)器端響應(yīng)的數(shù)據(jù)后,通過檢查是否滿足跨域的條件要求而決定是否對(duì)數(shù)據(jù)進(jìn)行攔截丟棄的過程。

跨域的必要條件
  1. 瀏覽器限制: 即瀏覽器對(duì)跨域行為進(jìn)行檢測(cè)和阻止
  2. 觸發(fā)跨域的三要素不同協(xié)議不同域名、不同端口,滿足其一
  3. 發(fā)起的是xhr請(qǐng)求: 即發(fā)起的是XMLHttpRequest類型的請(qǐng)求

跨域的幾種解決方案

  • 開發(fā)階段
  1. 解除瀏覽器安全限制(針對(duì)第一個(gè)必要條件)
  • window
    在chrome瀏覽器右鍵屬性中的目標(biāo)中添加 --args --disable-web-security --user-data-dir
    瀏覽器屬性配置圖

    重新打開瀏覽器顯示下圖提示,表示成功
    解除安全限制提示
  • linux
    直接運(yùn)行命令行 open -a "Google Chrome" --args --disable-web-security --user-data-dir
  1. 本地設(shè)置node代理服務(wù)器(針對(duì)第二個(gè)必要條件)
    很多框架的cli都已經(jīng)整合了本地代理服務(wù)器來進(jìn)行跨域,配置也更加簡(jiǎn)單。 以vue-cli為例:
    在config/index.js中簡(jiǎn)單配置即可
    vue-cli跨域設(shè)置
    原理:
    在本地配置代理服務(wù)器 項(xiàng)目就直接請(qǐng)求本地服務(wù)器,這樣就完美的避過了上面寫的第二個(gè)必要條件。然后本地服務(wù)器再和遠(yuǎn)程服務(wù)器進(jìn)行通信來獲取數(shù)據(jù)。
    跨域是瀏覽器的限制行為,服務(wù)器通信不存在跨域。
  • 生產(chǎn)階段
  1. jsonp請(qǐng)求(針對(duì)第三個(gè)必要條件)
    JSONP 方案原理就是通過動(dòng)態(tài)創(chuàng)建script標(biāo)簽,利用標(biāo)簽內(nèi)src屬性發(fā)送同步請(qǐng)求。本質(zhì)就是利用script標(biāo)簽加載遠(yuǎn)程js的特性,理論上來說有src屬性的標(biāo)簽都可以。
    通過瀏覽器控制臺(tái)Network選項(xiàng)查看發(fā)現(xiàn),JSONP發(fā)出去的請(qǐng)求類型是script,img標(biāo)簽src屬性發(fā)出去的請(qǐng)求類型是JSON,他們都不是xhr, 因?yàn)闆]有形成跨域的第三個(gè)條件,因此不會(huì)觸發(fā)瀏覽器跨域檢查策略。

雖然JSONP能處理跨域問題,但其實(shí)它存在很多弊端,主要如下:

    1. 需要服務(wù)器端修改代碼支持: 服務(wù)器端不再返回json格式,而是返回固定格式的回調(diào)函數(shù)
    1. 只支持GET請(qǐng)求: 即使設(shè)置了請(qǐng)求類型為POST也無效,只支持GET
    1. 發(fā)送的不是XHR請(qǐng)求: 正因?yàn)檫@點(diǎn)才支持了跨域,然而也丟失了xhr強(qiáng)大的功能
  1. 服務(wù)器端配置
    添加允許訪問的域名白名單
// 允許跨域的域名,設(shè)置*表示允許除帶Cookies信息的所有域名
  res.addHeader("Access-Control-Allow-Origin", "http://localhost:8081");

這樣在xhr請(qǐng)求的時(shí)候,瀏覽器判斷請(qǐng)求源域名在允許訪問的域名中,就不會(huì)進(jìn)行請(qǐng)求數(shù)據(jù)的攔截。所以就不會(huì)存在跨域問題。


請(qǐng)求頭

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

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

  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮,只允許與本...
    FLYSASA閱讀 1,885評(píng)論 0 6
  • ??2005 年,Jesse James Garrett 發(fā)表了一篇在線文章,題為“Ajax: A new App...
    霜天曉閱讀 942評(píng)論 0 1
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,135評(píng)論 0 2
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,412評(píng)論 0 6
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    HeroXin閱讀 955評(píng)論 0 4

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