然而現在很多Web Service都強調所謂的「mashup」,所以常常會需要存取跨網站的資源。因此有一般常見的方法有幾種:
- 透過proxy server
- 使用script tag
- 使用Fragment Identifier Messaging
不過這些方法都有效能或是安全的議題,這裡有比較詳細的說明 XML.com。
目前有個Standford的學生,跟一位微軟的研究員提出一種方法,透過Subspace來做到更安全的跨網域連線,主要的原理就是在原本的視窗中,產生一個中介的iFrame,裡面再放一個iFrame連線到不受信任的網站,進行步驟如下:
- 假設目前頁面為www.mashup.com
- 產生一個隱藏的iFrame (mediator frame),連線到目前網域的頁面
- 在mediator frame中產生一個iFrame (untrusted frame),連線到子網域的頁面(例如webservice.mashup.com)
- 在主視窗產生一個communication object (CB),並且傳到mediator frame (由於主視窗跟mediator frame是同網域,所以可以傳遞資料)
- 把mediator frame跟untrusted frame的document.domain都設成marshup.com,此時untrusted frame可以跟mediator frame交換資料,但由於跟主視窗domain不同,所以不能跟主視窗資料交換資料
- 將 CB 由mediator frame傳到untrusted frame,此時主視窗跟untrusted frame都擁有相同的 CB
- 在untrusted frame中,利用script tag來取得目標網域的資料,並且在資料傳遞完成後,透過 CB 的callback function來呼叫主視窗的function,進行資料處理 (IE & Firefox);或是在主視窗做pooling的動作,持續檢查untrusted frame是否已經取得所需資料 (Safari & Opera)
這邊其實敘述的很簡單,更詳細的資料可以參考他們發表的paper (PDF),或是到網站上看實作demo
=====
看完除了對cross-domain的ajax有更多的瞭解外,也終於知道,之前有關iFrame使用時,child frame跟parent frame互動上的問題所在....原來是不同瀏覽器對iFrame的一些行為不同~XD
