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