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

首頁 > 開發 > AJAX > 正文

AJAX的阻塞及跨域名解析

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

阻塞的AJAX請求

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

連續發起三個請求

function simpleRequest()
{
var request = new XMLHttpRequest();
request.open("POST", "Script.ashx");
request.send(null);
}

function threeRequests()
{
simpleRequest();
simpleRequest();
simpleRequest();
}


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

每個請求需要花費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>





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



<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" />
<iframe src="http://sub0.test.com/SubDomainProxy.html"
></iframe>
</body>
</html>





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



令人滿意的結果!

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



注意事項

  可能以下幾點值得一提:

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

原文:
作者:趙劼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品高清中文字幕| 久久精品人人爽| 96国产粉嫩美女| 国产成人高潮免费观看精品| 亚洲精品久久7777777| 欧美壮男野外gaytube| 国产精品嫩草影院一区二区| 欧美日韩在线观看视频小说| 国产精品视频在线播放| 青青久久av北条麻妃黑人| 欧洲美女免费图片一区| 一区二区在线视频| 欧美国产日韩二区| 国产成人欧美在线观看| 国产专区欧美专区| 欧洲亚洲免费视频| 欧美极品xxxx| 亚洲视频一区二区三区| 日韩精品中文字幕在线播放| 欧美性videos高清精品| 日韩欧美在线视频免费观看| 亚洲在线一区二区| 亚洲精品99久久久久中文字幕| 亚洲天堂一区二区三区| 欧美亚洲一级片| 色爱av美腿丝袜综合粉嫩av| 久久91亚洲精品中文字幕奶水| 亚洲欧美日韩天堂| 国产精品一久久香蕉国产线看观看| 91亚洲精品久久久| 久久久久久久久久国产精品| 爽爽爽爽爽爽爽成人免费观看| 亚洲人成网站色ww在线| 国产精品a久久久久久| 2019亚洲男人天堂| 国产精品久久久精品| 欧美亚洲一区在线| 国产一区二区三区网站| 欧美wwwwww| 久久久久久久久久久免费精品| 国产一区二区久久精品| 久久夜精品香蕉| 国产精品网站视频| 91成品人片a无限观看| 欧美—级高清免费播放| 91国产精品电影| 久久久精品一区二区| 97精品视频在线播放| 国产精品99久久久久久久久久久久| 久久在线观看视频| 国产亚洲美女精品久久久| 国产偷亚洲偷欧美偷精品| 激情亚洲一区二区三区四区| 97婷婷大伊香蕉精品视频| 精品自拍视频在线观看| 日本国产精品视频| 欧美在线亚洲一区| 亚洲国产另类 国产精品国产免费| 在线观看欧美日韩国产| 高清日韩电视剧大全免费播放在线观看| 国产91精品黑色丝袜高跟鞋| 精品日韩美女的视频高清| 国产精品白嫩初高中害羞小美女| 国产精品久久久久久久久久免费| 91久久久久久久一区二区| 国产精品久久久久久久av电影| 亚洲精品动漫100p| 97国产精品人人爽人人做| 国产精品电影一区| 成人在线激情视频| 成人欧美在线观看| 中文字幕日韩精品有码视频| 伊人久久久久久久久久久久久| 亚洲第一av网站| 国产精品观看在线亚洲人成网| 欧美一级电影久久| 久久久久久久久久av| www.精品av.com| 日韩成人av网址| 最近2019年好看中文字幕视频| 久久成人一区二区| 亚洲日本aⅴ片在线观看香蕉| 粉嫩av一区二区三区免费野| 欧美日韩视频免费播放| 青草青草久热精品视频在线观看| 在线精品播放av| 亚洲精品小视频在线观看| 国产一区红桃视频| 欧美日韩在线影院| 欧美性感美女h网站在线观看免费| 韩国日本不卡在线| 久久成年人视频| 91精品在线观看视频| 欧美激情一区二区三区在线视频观看| 久久青草精品视频免费观看| 欧美性猛交xxxx富婆| 成人乱人伦精品视频在线观看| 国产精品久久久久久婷婷天堂| 日韩免费av在线| 亚洲福利视频免费观看| 蜜臀久久99精品久久久久久宅男| 久久久天堂国产精品女人| 欧美激情在线狂野欧美精品| 久久视频在线观看免费| 成人春色激情网| 日韩美女免费视频| 亚洲国产高潮在线观看| 国产精品扒开腿做爽爽爽男男| 国产精品福利网站| 韩国精品久久久999| 欧日韩在线观看| 国产欧美欧洲在线观看| 国产精品日韩在线观看| 北条麻妃99精品青青久久| 日韩视频免费大全中文字幕| 亚洲色在线视频| 久久影视三级福利片| 久久人人爽人人爽人人片av高请| 国产精自产拍久久久久久蜜| 欧美成人免费大片| 欧美日韩亚洲天堂| 亚洲人成五月天| 国产欧美va欧美va香蕉在| 欧美日韩一区免费| 亚洲男人第一av网站| 色爱av美腿丝袜综合粉嫩av| 日韩电影大全免费观看2023年上| 国产日韩在线精品av| 亚洲第一精品夜夜躁人人爽| 国产午夜精品美女视频明星a级| 国外成人免费在线播放| 欧美黄色小视频| 77777少妇光屁股久久一区| 欧美成人午夜激情视频| 国产精品v日韩精品| 国产一区二区视频在线观看| 国产精品久久久久久久电影| 欧美精品国产精品日韩精品| 久久久久国产精品www| 久久中文字幕在线视频| 中文国产亚洲喷潮| 深夜福利国产精品| 美女精品久久久| 成人免费视频在线观看超级碰| 97视频人免费观看| 韩国精品久久久999| 在线亚洲国产精品网| 国产午夜精品一区理论片飘花| 精品人伦一区二区三区蜜桃网站| 国产精品一区二区三区毛片淫片| 少妇av一区二区三区| 国产91精品高潮白浆喷水| 青草青草久热精品视频在线网站| 亚洲天堂久久av| 日韩视频永久免费观看| 欧美日在线观看| 国产精品久久久久久久美男| 亚洲国产精品电影在线观看| 精品久久久免费| 91在线免费网站| 97国产精品视频| 久久久在线观看| 欧美视频二区36p| 欧美激情综合亚洲一二区|