摘要:什么是跨域要明白什么是跨域之前,首先要明白什么是同源策略同源策略就是用來限制從一個(gè)源加載的文檔或腳本與來自另一個(gè)源的資源進(jìn)行交互。最后,解決跨域問題還有一個(gè)更通用更強(qiáng)大的方法,我多帶帶把它拿出來總結(jié)了一篇文章跨域問題的根本解決方案。
什么是跨域?
要明白什么是跨域之前,首先要明白什么是同源策略?
同源策略就是用來限制從一個(gè)源加載的文檔或腳本與來自另一個(gè)源的資源進(jìn)行交互。那怎樣判斷是否是同源呢?
如果協(xié)議,端口(如果指定了)和主機(jī)對(duì)于兩個(gè)頁面是相同的,則兩個(gè)頁面具有相同的源,也就是同源。也就是說,要同時(shí)滿足以下3個(gè)條件,才能叫同源:
協(xié)議相同
端口相同
主機(jī)相同
舉個(gè)例子就一目了然了:
我們來看下面的頁面是否與 http://store.company.com/dir/index.html 是同源的?
http://store.company.com/dir/index2.html 同源
http://store.company.com/dir2/index3.html 同源 雖然在不同文件夾下
https://store.company.com/secure.html 不同源 不同的協(xié)議(https)
http://store.company.com:81/dir/index.html 不同源 不同的端口(81)
http://news.company.com/dir/other.html 不同源 不同的主機(jī)(news)
所以當(dāng)面對(duì)跨域問題的時(shí)候,有什么解決方案呢?
跨域的幾種解決方案 document.domain方法我們來看一個(gè)具體場(chǎng)景:有一個(gè)頁面 http://www.example.com/a.html ,它里面有一個(gè)iframe,這個(gè)iframe的源是 http://example.com/b.html ,很顯然它們是不同源的,所以我們無法在父頁面中操控子頁面的內(nèi)容。
解決方案如下:
所以我們只要將兩個(gè)頁面的document.domain設(shè)置成一致就可以了,要注意的是,document.domain的設(shè)置是有限制的,我們只能把document.domain設(shè)置成自身或更高一級(jí)的父域。
但是,這種方法只能解決主域相同的跨域問題。
window.name方法window對(duì)象有個(gè)name屬性,該屬性有個(gè)特征:即在一個(gè)窗口(window)的生命周期內(nèi),窗口載入的所有的頁面都是共享一個(gè)window.name的,每個(gè)頁面對(duì)window.name都有讀寫的權(quán)限,window.name是持久存在一個(gè)窗口載入過的所有頁面中的,并不會(huì)因新頁面的載入而進(jìn)行重置。
我們來看一個(gè)具體場(chǎng)景,在一個(gè)頁面 example.com/a.html 中,我們想獲取 data.com/data.html 中的數(shù)據(jù),以下是解決方案:
JSONP方法
JONSP(JSON with Padding)是JSON的一種使用模式。基本原理如下:
這時(shí)候在a.html中我們得到了一條js的執(zhí)行語句dealData("data"),從而達(dá)到了跨域的目的。
所以JSONP的原理其實(shí)就是利用引入script不限制源的特點(diǎn),把處理函數(shù)名作為參數(shù)傳入,然后返回執(zhí)行語句,仔細(xì)閱讀以上代碼就可以明白里面的意思了。
如果在jQuery中用JSONP的話就更加簡單了:
注意jQuery會(huì)自動(dòng)生成一個(gè)全局函數(shù)來替換callback=?中的問號(hào),之后獲取到數(shù)據(jù)后又會(huì)自動(dòng)銷毀,實(shí)際上就是起一個(gè)臨時(shí)代理函數(shù)的作用。$.getJSON方法會(huì)自動(dòng)判斷是否跨域,不跨域的話,就調(diào)用普通的ajax方法;跨域的話,則會(huì)以異步加載js文件的形式來調(diào)用JSONP的回調(diào)函數(shù)。
總結(jié)除了上述方法外,HTML5還新增了一個(gè)window.postMessage()方法,有興趣的可以自行查閱。
最后,解決跨域問題還有一個(gè)更通用更強(qiáng)大的CORS方法,我多帶帶把它拿出來總結(jié)了一篇文章:跨域問題的根本解決方案CORS 。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107469.html
摘要:二跨域解決方案原理利用標(biāo)簽沒有跨域限制的漏洞,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)。使用反向代理實(shí)現(xiàn)跨域,是最簡單的跨域方式。 前言 前后端數(shù)據(jù)交互經(jīng)常會(huì)碰到請(qǐng)求跨域,什么是跨域,以及有哪幾種跨域方式,這是本文要探討的內(nèi)容。 本文完整的源代碼請(qǐng)猛戳github博客,紙上得來終覺淺,建議動(dòng)手敲敲代碼 一、什么是跨域? 1.什么是同源策略及其限制內(nèi)容? 同源策略是一種約定,它是瀏覽器最核心...
摘要:二跨域解決方案原理利用標(biāo)簽沒有跨域限制的漏洞,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)。使用反向代理實(shí)現(xiàn)跨域,是最簡單的跨域方式。 前言 前后端數(shù)據(jù)交互經(jīng)常會(huì)碰到請(qǐng)求跨域,什么是跨域,以及有哪幾種跨域方式,這是本文要探討的內(nèi)容。 本文完整的源代碼請(qǐng)猛戳github博客,紙上得來終覺淺,建議動(dòng)手敲敲代碼 一、什么是跨域? 1.什么是同源策略及其限制內(nèi)容? 同源策略是一種約定,它是瀏覽器最核心...
摘要:關(guān)于,強(qiáng)烈推薦閱讀跨域資源共享詳解阮一峰另外,這里也整理了一個(gè)實(shí)現(xiàn)原理圖簡化版如何判斷是否是簡單請(qǐng)求瀏覽器將請(qǐng)求分成兩類簡單請(qǐng)求和非簡單請(qǐng)求。 前言 從剛接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在身邊重復(fù)出現(xiàn),一直到現(xiàn)在,已經(jīng)調(diào)試過N個(gè)跨域相關(guān)的問題了,16年時(shí)也整理過一篇相關(guān)文章,但是感覺還是差了點(diǎn)什么,于是現(xiàn)在重新梳理了一下。 個(gè)人見識(shí)有限,如有差錯(cuò),請(qǐng)多多見諒,歡迎提出iss...
摘要:什么是跨域個(gè)人一句話解釋如果與不同源,那么頁面不能獲取頁面的資源。所以用同源策略來限制跨域是必須的。它是標(biāo)準(zhǔn),是跨源請(qǐng)求的根本解決方法。 本文整理了一些有關(guān)跨域的基礎(chǔ)知識(shí)和細(xì)節(jié)問題。 什么是跨域 個(gè)人一句話解釋:如果 url A 與 url B 不同源,那么頁面A不能獲取頁面B的資源。這里有兩個(gè)關(guān)鍵詞:url 和 同源,瀏覽器的同源策略就是針對(duì)兩個(gè)url,它們滿足以下三個(gè)條件,才是同源...
摘要:開發(fā)者需要在中設(shè)置屬性為跨域是的簡稱這是一種利用瀏覽器漏洞解決跨域的辦法腳本元素可以不受瀏覽器同源策略的限制。 什么是瀏覽器同源策略? 同源是指,域名,協(xié)議,端口號(hào)均相同,如圖: showImg(https://segmentfault.com/img/bV9rAO?w=1088&h=394); 注意:localhost和127.0.0.1雖然都指向本機(jī),但也是跨域. 瀏覽器同源策略(...
閱讀 2260·2023-04-25 14:50
閱讀 1234·2021-10-13 09:50
閱讀 1866·2019-08-30 15:56
閱讀 1839·2019-08-29 15:29
閱讀 2886·2019-08-29 15:27
閱讀 3548·2019-08-29 15:14
閱讀 1192·2019-08-29 13:01
閱讀 3299·2019-08-26 14:06