由於安全方面的原因, 客戶端js使用xmlhttprequest只能用來向來源網站傳送請求,比如在www.readlog.cn下去請求test.readlog.cn的數據,都是不行的。不過,解決辦法倒是不少。這裡整理一下
Case I. web代理的方式 (on Server A)
由該頁面代替用戶頁面完成互動,從而返回合適的結果。此方案可以解決現階段所能夠想到的多數跨域訪問問題,但要求A網站提供Web代理的支持,因此A網站與B網站之間必須是緊密協作的,且每次互動過程,A網站的伺服器負擔增加,且無法代用戶保存session狀態。
Case II. on-Demand方式 (on Server A)
MYMSN的門戶就用的這種方式,不過 MYMSN中不涉及跨域訪問問題。在頁面內動態生成新的
Case III. iframe方式 (on Server A)
查看過醒來在JavaEye上的一篇關於跨域訪問的帖子,他提到自己已經用iframe的方式解決了跨域訪問問題。數據提交跟獲取,採用iframe這種方式的確可以了,但由於父視窗與子視窗之間不能互動(跨域訪問的情況下,這種互動被拒絕),因此無法完成對父視窗效果的影響。
在頁面內嵌或動態生成指向別的網站的IFRAME,然後這2個網頁間可以通過改變對方的anchor hash fragment來傳輸訊息。改變一個網頁的anchor hash fragment並不會使瀏覽器重新裝載網頁,所以一個網頁的狀態得以保持,而網頁本身則可以通過一個計時器(timer)來察覺自己anchor hash的變化,從而相應改變自己的狀態。
Case IV. 用戶本地轉儲方式 (local)
IE本身依附於windows平台的特性為我們提供了一種基於iframe,利用記憶體來“繞行”的方案,即兩個window之間可以在客戶端通過windows剪貼簿的方式進行數據傳輸,只需要在接受數據的一方設定Interval進行輪詢,獲得結果後清除Interval即可。FF的平台獨立性決定了它不支持剪貼簿這種方式,而以往版本的FF中存在的外掛程式漏洞又被fixed了,所以FF無法通過記憶體來完成暗渡陳倉。而由於檔案操作FF 也沒有提供支持(無法通過Cookie跨域完成數據傳遞),致使這種技巧性的方式只能在IE中使用。
Case V: (其實還是在服務端A用iframe解決了與伺服器B通信的問題)
要解決的問題:發生在用戶提交網頁 URL (還包括 Tag, Notes 等)給bookmark伺服器時。
關於 URL 的提交至少可以有三種方式:
1. 登入 Bookmark 伺服器的提交頁面,將要收藏的 URL 通過該頁面提交給伺服器。
2. 安裝瀏覽器外掛程式,通過外掛程式將URL提交給伺服器。
3. 從 Bookmark 伺服器動態載入 javascript 小工具到當前頁面,通過它來完成提交工作。
第一種方式開發起來最簡單,但對用戶來講比較麻煩,每次都需要先登入 Bookmark 伺服器才能完成提交;第二種方式我並不熟悉外掛程式開發,而且用戶也不喜歡太多的外掛程式堆滿自己的瀏覽器;第三種方式開發難度小,又避免了每次登入伺服器的麻煩,所以最終採用它。第三種方式中動態載入的 javascript 小工具除了需要生成 UI 供用戶填寫信息( URL , tag , notes 等),當用戶點擊提交的時候,還要完成與伺服器通信的功能。
跨域訪問,簡單來說就是 A 網站的 javascript 代碼試圖訪問 B 網站,包括提交內容和獲取內容。由於安全原因,跨域訪問是被各大瀏覽器所默認禁止的。寫過跨域訪問 ajax 的朋友相信都遇到過被告知“沒有許可權”的情況。通過 XMLHttp 來傳送數據給 Bookmark 伺服器的嘗試失敗了。於是,看到網上的一些資料,我又開始嘗試用 javascript 小工具在用戶網頁動態創建一個隱藏的 iframe, iframe 的 src 指向伺服器的一個 servlet ,試圖通過調用 iframe 中提供的 javascript 來完成與伺服器的通信。但不幸的是,用戶網頁中的 javascript 代碼訪問 iframe 也被瀏覽器歸為跨域訪問(特指 iframe 的 src 指向其它網站的情形),嘗試再次失敗。