JavaScript跨域的6種方法

2021-07-14 22:55:25 字數 3463 閱讀 4406

1 通過jsonp跨域(此方法對全域跨域和子域跨域都滿足)

jsonp(json with padding) 是 json 的一種"使用模式",可以讓網頁從別的網域名稱(**)那獲取資料,即跨域讀取資料。

為什麼我們從不同的域(**)訪問資料需要乙個特殊的技術(jsonp )呢?這是因為同源策略。

例如有個1.html,其中的**需要獲取乙個不同域上的json資料,假設這個json資料位址是則1.html為:

這樣jsonp的原理就很清楚了,通過script標籤引入乙個js檔案,這個js檔案載入成功後會執行我們在url引數中指定的函式,並且會把我們需要的json資料作為引數傳入。所以jsonp是需要伺服器端的頁面進行相應的配合的。

如果你的頁面使用jquery,那麼通過它封裝的方法就能很方便的來進行jsonp操作了。

2 通過修改document.domain來跨子域(涉及ifram)不同的框架之間(父子或同輩),是能夠獲取到彼此的window物件的,但蛋疼的是你卻不能使用獲取到的window物件的屬性和方法,就是只能獲取到乙個幾乎無用的window物件。比如,有乙個頁面,它的位址是  , 在這個頁面裡面有乙個iframe,它的src是 很顯然,這個頁面與它裡面的iframe框架是不同域的,所以我們是無法通過在頁面中書寫js**來獲取iframe中的東西的:

這個時候,document.domain就可以派上用場了,我們只要把 和 這兩個頁面的document.domain都設成相同的網域名稱就可以了。但要注意的是,document.domain的設定是有限制的,我們只能把document.domain設定成自身或更高一級的父域,且主域必須相同。例如:a.b.example.com 中某個文件的document.domain 可以設成a.b.example.com、b.example.com 、example.com中的任意乙個,但是不可以設成 c.a.b.example.com,因為這是當前域的子域,也不可以設成baidu.com,因為主域已經不相同了。

在頁面 中設定document.domain:

在頁面 中也設定document.domain,而且這也是必須的,雖然這個文件的domain就是example.com,但是還是必須顯示的設定document.domain的值:

這樣我們就可以通過js訪問到iframe中的各種屬性和物件了。

不過如果你想在 頁面中通過ajax直接請求 頁面,即使你設定了相同的document.domain也還是不行的,所以修改document.domain的方法只適用於不同子域的框架間的互動。如果你想通過ajax的方法去與不同子域的頁面互動,除了使用jsonp的方法外,還可以用乙個隱藏的iframe來做乙個**。原理就是讓這個iframe載入乙個與你想要通過ajax獲取資料的目標頁面處在相同的域的頁面,所以這個iframe中的頁面是可以正常使用ajax去獲取你要的資料的,然後就是通過我們剛剛講得修改document.domain的方法,讓我們能通過js完全控制這個iframe,這樣我們就可以讓iframe去傳送ajax請求,然後收到的資料我們也可以獲得了。

3 使用window.name來進行跨域

window物件有個name屬性,該屬性有個特徵:即在乙個視窗(window)的生命週期內,視窗載入的所有的頁面都是共享乙個window.name的,每個頁面對window.name都有讀寫的許可權,window.name是持久存在乙個視窗載入過的所有頁面中的,並不會因新頁面的載入而進行重置。注意,window.name的值只能是字串的形式,這個字串的大小最大能允許2m左右甚至更大的乙個容量,具體取決於不同的瀏覽器,但一般是夠用了。

下面就來看一看具體是怎麼樣通過window.name來跨域獲取資料的。還是舉例說明:

比如有乙個www.example.com/a.html頁面,需要通過a.html頁面裡的js來獲取另乙個位於不同域上的頁面www.cnblogs.com/data.html裡的資料。

data.html頁面裡的**很簡單,就是給當前的window.name設定乙個a.html頁面想要得到的資料值。

那麼在a.html頁面中,我們怎麼把data.html頁面載入進來呢?顯然我們不能直接在a.html頁面中通過改變window.location來載入data.html頁面,因為我們想要即使a.html頁面不跳轉也能得到data.html裡的資料。答案就是在a.html頁面中使用乙個隱藏的iframe來充當乙個中間人角色,由iframe去獲取data.html的資料,然後a.html再去得到iframe獲取到的資料。

充當中間人的iframe想要獲取到data.html的通過window.name設定的資料,只需要把這個iframe的src設為www.cnblogs.com/data.html就行了。然後a.html想要得到iframe所獲取到的資料,也就是想要得到iframe的window.name的值,還必須把這個iframe的src設成跟a.html頁面同乙個域才行,不然根據前面講的同源策略,a.html是不能訪問到iframe裡的window.name屬性的。這就是整個跨域過程。

4、使用html5中新引進的window.postmessage方法來跨域傳送資料

window.postmessage(message,targetorigin)  方法是html5新引進的特性,可以使用它來向其它的window物件傳送訊息,無論這個window物件是屬於同源或不同源,目前ie8+、firefox、chrome、opera等瀏覽器都已經支援window.postmessage方法。

呼叫postmessage方法的window物件是指要接收訊息的那乙個window物件,該方法的第乙個引數message為要傳送的訊息,型別只能為字串;第二個引數targetorigin用來限定接收訊息的那個window物件所在的域,如果不想限定域,可以使用萬用字元 *  。

需要接收訊息的window物件,可是通過監聽自身的message事件來獲取傳過來的訊息,訊息內容儲存在該事件物件的data屬性中。

上面所說的向其他window物件傳送訊息,其實就是指乙個頁面有幾個框架的那種情況,因為每乙個框架都有乙個window物件。在討論第二種方法的時候,我們說過,不同域的框架間是可以獲取到對方的window物件的,而且也可以使用window.postmessage這個方法。

5 通過資源共享跨域

http2.0中,ajax可以跨域,但是需要伺服器端配合。示例如下:

6通過**跨域

伺服器端不存在跨域問題,就是將請求通過**(在伺服器端編寫)**到所跨的域,響應也通過**傳到客戶端。

參考: 等

Javascript跨域和Ajax跨域解決方案

ajax跨域和js的跨域通訊 cross the site 的幾種解決方案 最近做的乙個專案中需要ajax跨域取得資料,如果是在本域中確實沒有問題,但是放到二級域和其他域下瀏覽器直接就彈出提示框 該頁正在訪問其控制範圍之外的資料,這有些危險,是否繼續 1.什麼引起了ajax跨域不能的問題 ajax本...

JavaScript 九種跨域方式實現原理

前言 前後端資料互動經常會碰到請求跨域,什麼是跨域,以及有哪幾種跨域方式,這是本文要 的內容。一 什麼是跨域?1.什麼是同源策略及其限制內容?同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到 xss csfr 等攻擊。所謂同源是指 協議 網域名稱 埠 三者...

6種跨域方式實現原理

1.jsonp 1 jsonp原理 利用script標籤沒有跨域限制的漏洞,網頁可以得到從其他 動態生產的json數,jsonp請求一定要對方的伺服器做支援才可以。2 jsonp和ajax對比 相同點 都是客戶端向服務端傳送請求,從服務端獲取資料的方式。不同點 ajax屬於同源策略,jsonp屬於非...