關於JS的跨域通信的幾種解決方案

1.什麼引起了ajax不能跨域請求的問題?
ajax本身實際上是通過XMLHttpRequest對象來進行數據的交互,而瀏覽器出於安全考慮,不允許js代碼進行跨域操作,所以會警告。 

2.有什麼完美的解決方案麼? 
沒有。解決方案有不少,但是隻能是根據自己的實際情況來選擇。 

具體情況有: 
一、本域和子域的相互訪問: www.aa.com和book.aa.com  (document.domain='aa.com')
二、本域和其他域的相互訪問: www.aa.com和www.bb.com 用 iframe 
三、本域和其他域的相互訪問: www.aa.com和www.bb.com 用 XMLHttpRequest訪問代理 
四、本域和其他域的相互訪問: www.aa.com和www.bb.com 用 JS創建動態腳本 (創建<script scr=''>jsoncallback)


解決方法: 
一、如果想做到數據的交互,那麼www.aa.com和book.aa.com必須由你來開發纔可以。可以將 book.aa.com用iframe添加到 www.aa.com的某個頁面下,在www.aa.com和iframe裏面都加上document.domain = "aa.com",這樣就可以統一域了,可以實現跨域訪問。就和平時同一個域中鑲嵌iframe一樣,直接調用裏面的JS就可以了。(這個辦法我沒有嘗 試,不過理論可行) 


二、當兩個域不同時,如果想相互調用,那麼同樣需要兩個域都是由你來開發纔可以。用iframe可以實現數據的互相調用。解決方案就是用 window.location對象的hash屬性。hash屬性就是http://domian/web/a.htm#dshakjdhsjka 裏面的#dshakjdhsjka。利用JS改變hash值網頁不會刷新,可以這樣實現通過JS訪問hash值來做到通信。不過除了IE之外其他大部分瀏 覽器只要改變hash就會記錄歷史,你在前進和後退時就需要處理,非常麻煩。不過再做簡單的處理時還是可以用的。大體的過程是頁面a和頁面b在不同域 下,b通過iframe添加到a裏,a通過JS修改iframe的hash值,b裏面做一個監聽(因爲JS只能修改hash,數據是否改變只能由b自己來 判斷),檢測到b的hash值被修改了,得到修改的值,經過處理返回a需要的值,再來修改a的hash值(這個地方要注意,如果a 本身是那種查詢頁面的話比如http://domian/web/a.aspx?id=3,在b中直接parent.window.location是無 法取得數據的,同樣報沒有權限的錯誤,需要a把這個傳過來,所以也比較麻煩),同樣a裏面也要做監聽,如果hash變化的話就取得返回的數據,再做相應的 處理。 


三、這種情形是最經常遇到的,也是用的最多的了。就是www.aa.com和www.bb.com你只能修改一個,也就是另外一個是別人 的,人家告訴你你要取得數據就訪問某某連接參數是什麼樣子的,最後返回數據是什麼格式的。而你需要做的就是在你的域下新建一個網頁,讓服務器去別人的網站 上取得數據,再返回給你。domain1下的a向同域下的GetData.aspx請求數據,GetData.aspx向domain2下的 ResponseData.aspx發送請求,ResponseData.aspx返回數據給GetData.aspx, GetData.aspx再返回給a,這樣就完成了一次數據請求。GetData.aspx在其中充當了代理的作用。具體可以看下我的代碼。 


四、這個和上個的區別就是請求是使用<script>標籤來請求的,這個要求也是兩個域都是由你來開發才行。原理就是JS文件 注入,在本域內的a 內生成一個JS標籤,它的SRC指向請求的另外一個域的某個頁面b,b返回數據即可,可以直接返回JS的代碼。因爲script的src屬性是可以跨域 的。具體看代碼,這個也比較簡單。 

總結: 
第一種情況:域和子域的問題,可以完全解決交互。 
第二種情況:跨域,實現過程非常麻煩,需要兩個域開發者都能控制,適用於簡單交互。 
第三種情況:跨域,開發者只控制一個域即可,實現過程需要增加代理取得數據,是常用的方式。 
第四種情況:跨域,兩個域開發者都需要控制,返回一段js代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章