摘要:在中,在不同的域名下面進(jìn)行數(shù)據(jù)交互,就會(huì)遇到跨域問(wèn)題,說(shuō)到跨域首先要從同源說(shuō)起,瀏覽器為了提供一種安全的運(yùn)行環(huán)境,各個(gè)瀏覽器廠商協(xié)定使用同源策略。在上面說(shuō)過(guò)是不受同源策略限制的,但是出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源請(qǐng)求。
對(duì)于前端開(kāi)發(fā)來(lái)說(shuō)跨域應(yīng)該是最不陌生的問(wèn)題了,無(wú)論是開(kāi)發(fā)過(guò)程中還是在面試過(guò)程中都是一個(gè)經(jīng)常遇到的一個(gè)問(wèn)題,在開(kāi)發(fā)過(guò)程中遇到這個(gè)問(wèn)題的話一般都是找后端同學(xué)去解決,以至于很多人都忽略了對(duì)跨域的認(rèn)識(shí)。為什么會(huì)導(dǎo)致跨域?遇到跨域又怎么去解決呢?本文會(huì)對(duì)這些問(wèn)題一一的介紹。
在JavaScript中,在不同的域名下面進(jìn)行數(shù)據(jù)交互,就會(huì)遇到跨域問(wèn)題,說(shuō)到跨域首先要從同源說(shuō)起,瀏覽器為了提供一種安全的運(yùn)行環(huán)境,各個(gè)瀏覽器廠商協(xié)定使用同源策略。
什么同源策略
同源策略:同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會(huì)受到影響??梢哉f(shuō)Web是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。
同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSRF等攻擊。所謂同源是指協(xié)議+域名+端口三者相同,即便兩個(gè)不同的域名指向同一個(gè)ip地址,也非同源。
Url組成部分
了解同源策略以后,同樣需要對(duì)url的組成部分也順帶了解一下吧,只有了解url之后當(dāng)出現(xiàn)跨域的時(shí)候才知道哪里出了問(wèn)題,這樣才能和后端、運(yùn)維開(kāi)懟,懟天懟地對(duì)空氣。O(∩_∩)O哈哈~其實(shí)不是啦,當(dāng)然是為了能夠和其他同事能做到良好的溝通,說(shuō)的的有理有據(jù),以理服人嘛,這才是王道。
從上圖中能夠清晰的看出url中每個(gè)部分的含義:
protocol:協(xié)議常用的協(xié)議是http
auth:驗(yàn)證,因?yàn)槊魑膫鬏斢脩裘兔艽a,非HTTPS環(huán)境下很不安全,一般用的非常少。
hostname:主機(jī)地址,可以是域名,也可以是IP地址
port:端口http協(xié)議默認(rèn)端口是:80端口,如果不寫(xiě)默認(rèn)就是:80端口
pathname:路徑網(wǎng)絡(luò)資源在服務(wù)器中的指定路徑
serarch:查詢字符串如果需要從服務(wù)器那里查詢內(nèi)容,在這里編輯
hash:哈希網(wǎng)頁(yè)中可能會(huì)分為不同的片段,如果想訪問(wèn)網(wǎng)頁(yè)后直接到達(dá)指定位置,可以在這部分設(shè)置
項(xiàng)目過(guò)程過(guò)程中經(jīng)常會(huì)用到一些緩存,瀏覽器為了網(wǎng)頁(yè)的安全在緩存的時(shí)候,由于同源策略的問(wèn)題對(duì)其緩存內(nèi)容進(jìn)行了限制,其實(shí)想想也是對(duì)的,如果不使用同源策略的話,很容易沖掉緩存的東西。
Cookie、LocalStorage和IndexDB等無(wú)法讀取。
DOM無(wú)法獲得。
AJAX請(qǐng)求不能發(fā)送。
當(dāng)然瀏覽器也沒(méi)有把所有的東西都限制了,比如圖片、互聯(lián)網(wǎng)資源等還是允許跨域請(qǐng)求的。允許跨域請(qǐng)求都是使用標(biāo)簽,只有三個(gè)標(biāo)簽是允許跨域加載資源: