亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

解讀AJAX的跨域名訪問

2024-09-01 08:26:20
字體:
來源:轉載
供稿:網友

  標題有些唬人的成分,因為這里跨的只是子域名。

  事情的經過是這樣的,還是那個個人門戶網站。其中有個功能就是RSS訂閱,每個訂閱作為一個模塊出現在頁面上。如果一個用戶訂閱了比較多的RSS,則在打開頁面時所有的RSS模塊就會開始加載,這時候可能就會需要十幾秒甚至更長的時間才能加載完畢。這時,如果用戶需要作別的AJAX操作——比如保存頁面設置——那么長時間的等待就不可避免了,誰讓瀏覽器對于相同域名只能同時存在兩個連接呢?不過這可不是一個好的用戶體驗,那么我們需要怎么做呢?

  第一種做法可能比較容易想到,我們可以自己編寫代碼維護一個Priority Queue,為每個請求附加一個“優先級”信息,這樣我們就可以把重要的請求率先發出。這樣就可以在一定程度上解決用戶的等待問題。可惜這個方法還是無法突破兩個連接的限制。于是第二種做法,我們就要設法突破兩個連接的限制了。如果能夠向別的域名發出AJAX請求,不也就能避免重要的請求被大量的請求所阻塞了嗎?

  我們還是從頭看起,一點一點地來解決這個問題。

 

阻塞的AJAX請求

  我們先來證實一下請求的阻塞情況吧。我們使用如下的代碼:

連續發起三個請求
function simpleRequest(){    var request = new XMLHttpRequest();    request.open("POST", "Script.ashx");    request.send(null);}function threeRequests(){    simpleRequest();    simpleRequest();    simpleRequest();}

 

  當執行threeRequests時就會連續發出3個相同域名的請求,還是通過統計圖表來查看阻塞的效果(如圖11):

圖11:最后的請求被前兩個請求阻塞

 

  每個請求需要花費1.5秒的時間。很明顯,第三個請求必須等到第一個請求結束之后才能執行,因此總共需要進行3秒多鐘才能執行完畢。我們要改變的就是這個狀況。

 

傳統的跨域名異步請求解決方案

  AJAX安全性的唯一保證,似乎就是對于跨域名(Cross-Domain)AJAX請求的限制。除非打開本地硬盤的網頁,或者在IE中將跨域名傳輸數據的限制打開,否則向其他域名發出AJAX請求都會被禁止。而且對于跨域名的判斷非常嚴格,不同的子域名,或者相同域名的不同端口,都會被認作是不同的域名,我們不能向它們的資源發出AJAX請求。

  從表面上看起來似乎沒有辦法打破這個限制,還好我們有個救星,那就是iframe!

  iframe雖然不在標準中出現,但是由于它實在有用,FireFox也“不得不”對它進行了支持(類似的還有innerHTML)。網上已經有一些跨域名發出異步請求的做法,但是它們實在做的不好。它們的簡單工作原理如下:在另一個域名下放置一個特定的頁面文件作為Proxy,主頁面將異步請求的信息通過Query String傳遞入iframe里的Proxy頁面,Proxy頁面在AJAX請求執行完畢后將結果放在自己location的hash中,而主頁面會對iframe的src的hash值進行輪詢,一旦發現它出現了改變,則通過hash值得到需要的信息。

  這個方法的實現比較復雜,而且功能有限。在IE和FireFox中,對于URL的長度大約可以支持2000個左右的字符。對于普通的需求它可能已經足夠了,可惜如果真要傳遞大量的數據,這就遠遠不夠了。與我們一會兒要提出的解決方案相比,可能它唯一的優勢就是能夠跨任意域名進行異步請求,而我們的解決方案只能突破子域名的限制。

  那么現在來看看我們的做法!

 

優雅地突破子域名的限制

  我們突破子域名限制的關鍵還是在于iframe。

  iframe是的好東西,我們能夠跨過子域名來訪問iframe里的頁面對象,例如window和DOM結構,包括調用JavaScript(通過window對象)——我們將內外頁面的document.domain設為相同就可以了。然后在不同子域名的頁面發起不同的請求,把結果通過JavaScript進行傳遞即可。唯一需要的也僅僅是一個簡單的靜態頁面作為Proxy而已。

  我們現在就來開始編寫一個原形,雖然簡單,但是可以說明問題。

  首先,我們先來編寫一個靜態頁面,作為放在iframe里的Proxy,如下:

SubDomainProxy.html
<html xmlns="http://www.w3.org/1999/xhtml" ><head>    <title>Untitled Page</title>    <script type="text/javascript" language="javascript">        document.domain = "test.com";                function sendRequest(method, url)        {            var request = new XMLHttpRequest();            request.open(method, url);            request.send(null);        }    </script></head><body></body></html>

 

  然后我們再編寫我們的主頁面:

http://www.test.com/Default.html
<html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server">    <title>Untitled Page</title>    <script type="text/javascript" language="javascript">        document.domain = "test.com";            function simpleRequest()        {            var request = new XMLHttpRequest();            request.open("POST", "Script.ashx");            request.send(null);        }                function crossSubDomainRequest()        {            var proxy = document.getElementById("iframeProxy").contentWindow;            proxy.sendRequest('POST', 'http://sub0.test.com/Script.ashx');        }                function threeRequests()        {            simpleRequest();            simpleRequest();            crossSubDomainRequest();        }    </script></head><body>    <input type="button" value="Request" onclick="threeRequests()" />    <iframe src="http://sub0.test.com/SubDomainProxy.html" style="display:none;"         id="iframeProxy"></iframe></body></html>

 

  當執行threeRequests方法時,將會同時請求http://www.test.com以及http://sub0.test.com兩個不同域名下的資源。很明顯,最后一個請求已經不會受到前兩個請求的阻塞了(如圖12):

圖12:不同域名的請求不會被阻塞

  令人滿意的結果!

  雖說只能突破子域名,但是這已經足夠了,不是嗎?我們為什么要強求任意域名之間能夠異步通訊呢?更何況我們的解決方案是多么的優雅!在下一篇文章中,我們將會為ASP.NET AJAX客戶端實現一個完整的CrossSubDomainRequestExecutor,它會自動判斷是否正在發出跨子域名的請求,并選擇AJAX請求的方式。這樣,客戶端的異步通訊層就會對開發人員完全透明。世上還會有比這更令人愉快的事情嗎?:)

 

注意事項

  可能以下幾點值得一提:

  • 我在出現這個想法之后也作了一些嘗試,最后發現創建XMLHttpRequest對象,調用open方法和send方法都必須在iframe中的頁面中執行才能夠在IE和FireFox中成功發送AJAX請求。
  • 在上面的例子中,我們向子域名請求的的路徑是http://sub0.test.com/Script.ashx。請注意,完整的子域名不可以省略,否則在FireFox下就會出現權限不夠的錯誤,在調用open方法時就會拋出異常——似乎FireFox把它當作了父頁面域名的資源了。
  • Windows Live Contacts Gadget使用了一種叫做Channel的技術,用于解決跨任意域名傳遞數據的問題,我相當佩服微軟技術人員的創造力。Channel技術是一種優秀的解決跨域名異步請求問題的解決方案,而且如果將它封裝成了組件,那么使用起來也會相當優雅(似乎微軟已經準備這么做了)。不過它和我們現在需要解決的問題并不相同,如果有機會的話,我也會詳細的解釋一下Channel技術——但不是現在,因為我覺得我還沒有完全理解這個技術本身。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品欧美激情| 孩xxxx性bbbb欧美| 91精品国产综合久久久久久久久| 91国内免费在线视频| 欧美电影在线观看高清| 久久视频精品在线| 亚洲国产精品热久久| 欧美激情精品在线| 国产精品第8页| 国产欧美日韩免费| 欧美日韩综合视频网址| 亚洲一区二区久久久久久久| 成人久久一区二区| 高清在线视频日韩欧美| 欧美日韩在线一区| 国产丝袜精品第一页| 日韩电影在线观看免费| 黄色精品一区二区| 欧美日韩一区二区三区| 国产成人97精品免费看片| www.久久久久久.com| 久久亚洲综合国产精品99麻豆精品福利| 国产91精品青草社区| 欧美黑人性猛交| 久久亚洲国产精品成人av秋霞| 国产精品免费一区| 亚洲国内高清视频| 色偷偷av一区二区三区乱| 91香蕉嫩草影院入口| 中文字幕日韩欧美| 精品国产一区二区三区久久狼黑人| 日韩三级成人av网| 人妖精品videosex性欧美| 91九色国产在线| 欧美国产日韩一区二区在线观看| 成人网页在线免费观看| 欧美日韩性视频在线| 97色在线视频| 日韩欧美在线播放| 国产精品嫩草影院久久久| 久久不射电影网| 91精品国产91久久久| 91探花福利精品国产自产在线| 成人黄色影片在线| 亚洲人成欧美中文字幕| 不卡伊人av在线播放| 久久久成人精品视频| 久久久国产一区二区三区| 色偷偷av一区二区三区乱| 在线中文字幕日韩| 在线日韩av观看| 久久久精品国产亚洲| 日韩av网站导航| 国产精品女主播视频| 在线播放国产一区二区三区| 国产精品久久久久久久久借妻| 91精品久久久久久久久久久久久| 久久国产精品久久久久久久久久| 国产精品青青在线观看爽香蕉| 日韩视频精品在线| 精品久久久久久中文字幕一区奶水| 精品日韩美女的视频高清| 亚洲国产天堂久久国产91| 亚洲成人av在线播放| 欧美激情xxxxx| 久久久久久一区二区三区| 国产69久久精品成人看| 亚洲a中文字幕| 成人午夜激情免费视频| 亚洲福利视频在线| 91超碰caoporn97人人| 欧美大奶子在线| 成人字幕网zmw| 欧美黄色片在线观看| 日韩精品999| 亚洲人成伊人成综合网久久久| 亚洲欧美综合精品久久成人| 琪琪亚洲精品午夜在线| 久久久av亚洲男天堂| 国模私拍一区二区三区| 亚洲成人激情小说| 欧美性xxxxhd| 91精品在线国产| 久久久av电影| 亚洲欧美www| 色噜噜狠狠狠综合曰曰曰88av| 亚洲视频电影图片偷拍一区| 欧美在线视频观看免费网站| 亚洲欧美自拍一区| 成人黄色免费看| 欧美成aaa人片在线观看蜜臀| 午夜欧美不卡精品aaaaa| 九九热r在线视频精品| 久久久久这里只有精品| 美女精品视频一区| 精品中文字幕乱| 国产ts一区二区| 久久免费在线观看| 国内精品久久久久影院 日本资源| 日韩高清有码在线| 欧美丝袜一区二区三区| 亚洲新中文字幕| 日韩av在线资源| 精品中文字幕在线2019| 久久免费精品视频| zzjj国产精品一区二区| 日韩av高清不卡| 亚洲美女精品久久| 欧美精品18videos性欧美| 国产激情久久久| 国产一区二区三区在线免费观看| 日韩av在线播放资源| 亚洲www永久成人夜色| 成人亚洲欧美一区二区三区| 国内偷自视频区视频综合| 欧美日韩在线观看视频小说| 亚洲人成五月天| 国产在线观看一区二区三区| 日韩av在线看| 日本精品在线视频| 国产v综合v亚洲欧美久久| 青青久久av北条麻妃黑人| 狠狠躁夜夜躁久久躁别揉| 在线播放精品一区二区三区| 性欧美xxxx交| 精品国产精品自拍| 亚洲最新av网址| 亚洲欧美激情精品一区二区| 国产有码一区二区| 欧美区二区三区| 2018日韩中文字幕| 日韩在线视频一区| 久久免费少妇高潮久久精品99| 伊人av综合网| 亚洲欧美日韩另类| 福利二区91精品bt7086| 中文字幕一区二区三区电影| 久久伊人精品一区二区三区| 亚洲成人网av| 亚洲丝袜在线视频| 日本一欧美一欧美一亚洲视频| 国产精品国产三级国产专播精品人| 中文字幕日韩精品在线| 亚洲欧美三级在线| 8090理伦午夜在线电影| 日本乱人伦a精品| 日韩一区二区精品视频| 2020久久国产精品| 日韩最新中文字幕电影免费看| 亚洲一区二区三区视频播放| 日韩一级黄色av| 国产深夜精品福利| 国产成人综合亚洲| 久久久亚洲国产天美传媒修理工| 理论片在线不卡免费观看| 亚洲娇小xxxx欧美娇小| 久久夜精品va视频免费观看| 欧美激情在线狂野欧美精品| 亚洲综合在线播放| 久久久在线观看| 57pao成人国产永久免费| 91日本在线观看| 久热精品视频在线免费观看| 成人在线精品视频|