App下載

在react項(xiàng)目中怎么解決跨域問(wèn)題?解決跨域問(wèn)題的方法!

猿友 2021-06-18 17:49:17 瀏覽數(shù) (4947)
反饋

在我們的React相關(guān)知識(shí)學(xué)習(xí)中或多或少會(huì)在平時(shí)中聽(tīng)到跨域問(wèn)題,那么今天我們就來(lái)深入學(xué)習(xí)一下吧!來(lái)看看有關(guān)于“在react項(xiàng)目中怎么解決跨域問(wèn)題?”這個(gè)問(wèn)題的解決方法!下面是小編準(zhǔn)備的一些相關(guān)信息,大家可以作為參考!


一.為什么會(huì)出現(xiàn)跨域?

因?yàn)槲覀兊臑g覽器遵循同源政策(?scheme?(協(xié)議)、?host?(主機(jī))、和?port?(端口))都是被稱(chēng)為同源。有同源就有非同源,那么在非同源中有下面這些限制:不讀取和修改對(duì)方的DOM、不讀取和訪問(wèn)對(duì)方的?Cookie? ,?IndexDB? 和 ?LocalStorage?、限制?XMLHttpRequest?請(qǐng)求。而且當(dāng)瀏覽器向目標(biāo)路徑發(fā)送Ajax請(qǐng)求的時(shí)候,只要我們當(dāng)前的路徑和目標(biāo)路徑不同源,則會(huì)產(chǎn)生跨域,也被稱(chēng)為跨域請(qǐng)求。


二.解決方法

1.JSONP

jsonp是指服務(wù)器與客戶(hù)端跨源通信常用的方法,擁有簡(jiǎn)單適用、兼容性好的特點(diǎn),但是它有一個(gè)缺點(diǎn)就是只支持get請(qǐng)求不支持post請(qǐng)求。然而在?HTML?的標(biāo)簽中有一些標(biāo)簽是沒(méi)有跨域限制的,比如 ?script? 和?img?這兩個(gè)就是了。對(duì)于這個(gè)的方法的用法就是通過(guò)在網(wǎng)頁(yè)中添加一個(gè)?<script>?,然后在向服務(wù)器請(qǐng)求?json?數(shù)據(jù),等服務(wù)器收到請(qǐng)求之后,就會(huì)將這個(gè)數(shù)據(jù)放在一個(gè)指定名字通過(guò)回調(diào)函數(shù)的參數(shù)位置傳回來(lái)。


2.CORS

在這個(gè)方法中擁有普通跨域請(qǐng)求和帶?cookie?跨域請(qǐng)求。在普通跨域請(qǐng)求中:我們只需要在服務(wù)端設(shè)置?Access-Control-Allow-Origin?

,然而在帶cookie跨域請(qǐng)求中:前后端都需要進(jìn)行設(shè)置(前端設(shè)置:根據(jù)?xhr.withCredentials?字段判斷是否帶有?cookie?)。


3.proxy

我們可以通過(guò)這個(gè)方法在?package.json?文件中使用?proxy?配置就可以解決跨域問(wèn)題,代碼如下:

"proxy":{
    "/api":{
       "target":"http://xxx.xxx.com",
       "changeOrigin": true,
       "pathRewrite": {
        "^/api": ""
    }
     }
 }

代碼中的target是指接口的域名;?changeorigin?是指開(kāi)啟代理;對(duì)于?pathRewrite?的話(huà)是指:可以看到我使用了/api來(lái)匹配請(qǐng)求接口的域名,而接口名稱(chēng)是/admin/login,因此在實(shí)際請(qǐng)求中應(yīng)該寫(xiě)成/api/admin/login,但是我實(shí)際請(qǐng)求的地址又是沒(méi)有?api?前綴的,因此需要通過(guò)?pathRewrite?重寫(xiě)地址,將接口請(qǐng)求的時(shí)候前綴去除。


4.Nginx

在上面的方法中可以解決我們很多在開(kāi)發(fā)中的跨域問(wèn)題,但是卻無(wú)法解決生產(chǎn)環(huán)境上的跨域問(wèn)題。這個(gè)方法的功能有這么幾種:http服務(wù)器(可以獨(dú)立提供http服務(wù))、虛擬主機(jī)(可以多個(gè)域名指向同一個(gè)服務(wù)器,而且服務(wù)器根據(jù)不同的域名把請(qǐng)求轉(zhuǎn)發(fā)到不同的應(yīng)用服務(wù)器)、方向代理(負(fù)載均衡,將請(qǐng)求轉(zhuǎn)發(fā)至不同的服務(wù)器).


總結(jié):

這就是今天有關(guān)于“在react項(xiàng)目中怎么解決跨域問(wèn)題?”這個(gè)問(wèn)題小編收集的內(nèi)容,當(dāng)然如果你有更好的方法可提出來(lái)和大家探討學(xué)習(xí),更多有關(guān)于react這方面的內(nèi)容我們都可以在React 教程中進(jìn)行學(xué)習(xí)和了解。


參考資料:

JSONP與CORS相關(guān)內(nèi)容文章鏈接:https://blog.csdn.net/qq_38128179/article/details/84956552

Mac安裝nginx注意事項(xiàng)和流程鏈接:https://www.cnblogs.com/yy136/p/12690225.html


0 人點(diǎn)贊