前端跨域一些知識(shí)點(diǎn)

小結(jié);

1、跨域是因?yàn)檎?qǐng)求資源的服務(wù)器和資源服務(wù)器的協(xié)議,域名和端口不同,為了不跨域,就要讓他們處在同一個(gè)域。如果是協(xié)議和端口不同,前端沒法處理跨域。

2、常用的方法有一、JSONP(利用src沒有跨域限制,傳一個(gè)函數(shù)名作為參數(shù)到后臺(tái),后臺(tái)拼接函數(shù)名和數(shù)據(jù)返回前端,然后自動(dòng)調(diào)用前端的函數(shù)。缺點(diǎn)就是只能用get方法,限制多,不安全)

? ? ? ?二、CORS(跨域資源共享,就是在后臺(tái)響應(yīng)頭中設(shè)置Access-Control-Allow-Origin允許指定的域訪問,缺點(diǎn)是不安全)

? ? ? ?三、nginx(讓請(qǐng)求和被請(qǐng)求的服務(wù)器處在同一個(gè)域下)

? 3、跨域雖然存在,但是請(qǐng)求依然發(fā)出并且返回,只不過是被瀏覽器攔截了。


由于src屬性的值可以是任意的URL,因此來自一個(gè)Web服務(wù)器的JavaScript程序或Web頁面可以使用由另一個(gè)Web服務(wù)器輸出的代碼。

所謂同源是指"協(xié)議+域名+端口"三者相同,即便兩個(gè)不同的域名指向同一個(gè)ip地址,也非同源。

不同源的客戶端腳本在沒有明確授權(quán)下不能讀取對(duì)方的資源。所以a.com下的js腳本采用ajax讀取b.com里面的文件數(shù)據(jù)是會(huì)報(bào)錯(cuò)的。

如果要進(jìn)行跨域請(qǐng)求,可以使用html的script標(biāo)簽來進(jìn)行跨域請(qǐng)求,并在響應(yīng)中返回要執(zhí)行的script代碼,其中可以直接使用json傳遞js對(duì)象,這種跨域的通訊方式稱為jsonp。

特別說明:

一:如果是協(xié)議和端口造成的跨域問題“前臺(tái)”是無能為力的。

跨域并不是請(qǐng)求發(fā)不出去,請(qǐng)求能發(fā)出去,服務(wù)端能收到請(qǐng)求并正常返回結(jié)果,只是結(jié)果被瀏覽器攔截了。你可能會(huì)疑問明明通過表單的方式可以發(fā)起跨域請(qǐng)求,為什么?Ajax?就不會(huì)?

因?yàn)闅w根結(jié)底,跨域是為了阻止用戶讀取到另一個(gè)域名下的內(nèi)容,Ajax?可以獲取響應(yīng),瀏覽器認(rèn)為這不安全,所以攔截了響應(yīng)。但是表單并不會(huì)獲取新的內(nèi)容,所以可以發(fā)起跨域請(qǐng)求。同時(shí)也說明了跨域并不能完全阻止?CSRF,因?yàn)檎?qǐng)求畢竟是發(fā)出去了。

1.當(dāng)用戶發(fā)送localhost:80/時(shí)會(huì)被nginx轉(zhuǎn)發(fā)到http://localhost:81服務(wù);

2.當(dāng)界面請(qǐng)求接口數(shù)據(jù)時(shí),只要以/apis?為開頭,就會(huì)被nginx轉(zhuǎn)發(fā)到后端接口服務(wù)器上;

總結(jié):nginx實(shí)現(xiàn)跨域的原理,實(shí)際就是把web項(xiàng)目和后端接口項(xiàng)目放到一個(gè)域中,這樣就不存在跨域問題,然后根據(jù)請(qǐng)求地址去請(qǐng)求不同服務(wù)器(真正干活的服務(wù)器);

CORS?全稱是跨域資源共享(Cross-Origin?Resource?Sharing),是一種?ajax?跨域請(qǐng)求資源的方式

當(dāng)你使用?XMLHttpRequest?發(fā)送請(qǐng)求時(shí),瀏覽器發(fā)現(xiàn)該請(qǐng)求不符合同源策略,會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin,后臺(tái)進(jìn)行一系列處理,如果確定接受請(qǐng)求則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin;?瀏覽器判斷該相應(yīng)頭中是否包含?Origin?的值,如果有則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)后臺(tái)進(jìn)行一系列處理,如果確定接受請(qǐng)求則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin;?瀏覽器判斷該相應(yīng)頭中是否包含?Origin?的值,如果有則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)。

#?直接請(qǐng)求nginx也是會(huì)報(bào)跨域錯(cuò)誤的這里設(shè)置允許跨域

#?如果代理地址已經(jīng)允許跨域則不需要這些,?否則報(bào)錯(cuò)(雖然這樣nginx跨域就沒意義了)

add_header?Access-Control-Allow-Origin?*;

可以參考鏈接:

【跨域?-?饑人谷_fanison?-?簡書】http://www.itdecent.cn/p/1a22e1aa0e49

【什么是跨域?如何解決??-?仰望星空得少年?-?簡書】http://www.itdecent.cn/p/8fa2acd103ea

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮,只允許與本...
    FLYSASA閱讀 1,885評(píng)論 0 6
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,134評(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
  • 前端開發(fā)中,跨域使我們經(jīng)常遇到的一個(gè)問題,也是面試中經(jīng)常被問到的一些問題,所以,這里,我們做個(gè)總結(jié)。小小問題,不足...
    Nealyang閱讀 514評(píng)論 0 0

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