1. 程式人生 > 其它 >Ajax跨域問題,你是如何解決的?

Ajax跨域問題,你是如何解決的?

面試官問你這樣的問題,比如:

客戶端的域名是client.runoob.com,而請求的域名是server.runoob.com。

如果直接使用ajax訪問,會有以下錯誤:

 

 

你會如何去解決呢?

 

你可以通過設定Access-Control-Allow-Origin來實現跨域

下面提供3種解決方式,面試或者在開發的時候對你有些許幫助。

 

1、允許單個域名訪問

指定某域名(http://client.runoob.com)跨域訪問,則只需在http://server.runoob.com/server.php檔案頭部新增如下程式碼:

 

 

2、允許多個域名訪問

指定多個域名(http://client1.runoob.com、http://client2.runoob.com等)跨域訪問,則只需在http://server.runoob.com/server.php檔案頭部新增如下程式碼:

 

 

3、允許所有域名訪問

允許所有域名訪問則只需在http://server.runoob.com/server.php檔案頭部新增如下程式碼:

 

 


你也可以通過document.domain+iframe 來解決跨域問題

對於主域相同,子域不同,我們可以設定相同的document.domain來欺騙瀏覽器,達到跨子域的效果。

例如:我們有兩個域名:www.a.com 和 img.a.com

在www.a.com下有a.html

在img.a.com下有img.json和img.html這兩個檔案。

img.json就是一些我們要獲取的資料:

 

 img.html就是我們iframe要引用的:

 

 a.html就是要通過跨子域獲取資料的頁面:

 

 

a.html中我們通過contentWindow.$來獲取子頁面的jquery物件,然後通過getJSON獲取資料,並通過www.a.com上的$物件把資料寫入到ul中。

 

在子頁面img.html中我們通過parent.window來訪問父頁面的$物件,並操作元素新增資料。

 

還有一種是jsonp的解決方案

首先要說明一下json和jsonp的區別?

json是一種基於文字的資料交換方式,或者叫做描述資料的一種格式。

 

 

而jsonp是一種非官方跨域資料互動協議,該協議允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將這個callback引數作為函式名來包裹住json資料,這樣客戶端就可以隨意定製自己的函式來自動處理返回資料了。

比如我在a.com的網站上引用了b.com的一個b.js,但這樣跨域的引用並不會產生錯誤,說明呼叫js檔案時不受跨域的影響。

 

那麼我們在b.js裡新增如下程式碼,看看是否能夠執行  

 

 

確定是可以執行。

那麼如果我們在a.com上自已建立一個js函式,而在b.com下的b.js中呼叫,那是否可行呢?

a.com下的index.html如下:

 

 b.com下的b.js如下:

 

 

上面也是可以執行的,我們可以看到在b.js中的資料確實正確的傳到了函式a中。

 

問題又來了,a.com中建立的函式名與b.js中呼叫的函式名必須一致,那麼如何才能讓b.com服務端知道這個函式名,只有通過位址列來傳遞了,加上一個callback=函式名來傳遞。當然callback這個命名可以改,但大家都這麼命名,也就約定俗成了。

 

a.com下的index.html如下:

 

 b.com下的b.php如下:

 

 

上面也是可以執行的,知道了回撥函式名,b.com服務端處理好資料,然後通過字串拼接輸出。

jquery中就已經提供了jsonp的支援,a.com下的index.html如下所示:

 

 跨域策略限制情況表如下: