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如下所示:
跨域策略限制情況表如下: