最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

AJAX的阻塞及跨域名解析

 更新時(shí)間:2007年07月05日 00:00:00   作者:  
阻塞的AJAX請(qǐng)求

  我們先來證實(shí)一下請(qǐng)求的阻塞情況吧。我們使用如下的代碼:

連續(xù)發(fā)起三個(gè)請(qǐng)求

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

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

當(dāng)執(zhí)行threeRequests時(shí)就會(huì)連續(xù)發(fā)出3個(gè)相同域名的請(qǐng)求,還是通過統(tǒng)計(jì)圖表來查看阻塞的效果,如圖:
點(diǎn)擊在新窗口中瀏覽此圖片
每個(gè)請(qǐng)求需要花費(fèi)1.5秒的時(shí)間。很明顯,第三個(gè)請(qǐng)求必須等到第一個(gè)請(qǐng)求結(jié)束之后才能執(zhí)行,因此總共需要進(jìn)行3秒多鐘才能執(zhí)行完畢。我們要改變的就是這個(gè)狀況。

傳統(tǒng)的跨域名異步請(qǐng)求解決方案

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

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

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

  這個(gè)方法的實(shí)現(xiàn)比較復(fù)雜,而且功能有限。在IE和FireFox中,對(duì)于URL的長(zhǎng)度大約可以支持2000個(gè)左右的字符。對(duì)于普通的需求它可能已經(jīng)足夠了,可惜如果真要傳遞大量的數(shù)據(jù),這就遠(yuǎn)遠(yuǎn)不夠了。與我們一會(huì)兒要提出的解決方案相比,可能它唯一的優(yōu)勢(shì)就是能夠跨任意域名進(jìn)行異步請(qǐng)求,而我們的解決方案只能突破子域名的限制。

  那么現(xiàn)在來看看我們的做法!



優(yōu)雅地突破子域名的限制

  我們突破子域名限制的關(guān)鍵還是在于iframe。

  iframe是的好東西,我們能夠跨過子域名來訪問iframe里的頁面對(duì)象,例如window和DOM結(jié)構(gòu),包括調(diào)用JavaScript(通過window對(duì)象)——我們將內(nèi)外頁面的document.domain設(shè)為相同就可以了。然后在不同子域名的頁面發(fā)起不同的請(qǐng)求,把結(jié)果通過JavaScript進(jìn)行傳遞即可。唯一需要的也僅僅是一個(gè)簡(jiǎn)單的靜態(tài)頁面作為Proxy而已。

  我們現(xiàn)在就來開始編寫一個(gè)原形,雖然簡(jiǎn)單,但是可以說明問題。

  首先,我們先來編寫一個(gè)靜態(tài)頁面,作為放在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>




  然后我們?cè)倬帉懳覀兊闹黜撁妫?br>
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>




  當(dāng)執(zhí)行threeRequests方法時(shí),將會(huì)同時(shí)請(qǐng)求http://www.test.com以及http://sub0.test.com兩個(gè)不同域名下的資源。很明顯,最后一個(gè)請(qǐng)求已經(jīng)不會(huì)受到前兩個(gè)請(qǐng)求的阻塞了 如圖:


點(diǎn)擊在新窗口中瀏覽此圖片
令人滿意的結(jié)果!

  雖說只能突破子域名,但是這已經(jīng)足夠了,不是嗎?我們?yōu)槭裁匆獜?qiáng)求任意域名之間能夠異步通訊呢?更何況我們的解決方案是多么的優(yōu)雅!在下一篇文章中,我們將會(huì)為ASP.NET AJAX客戶端實(shí)現(xiàn)一個(gè)完整的CrossSubDomainRequestExecutor,它會(huì)自動(dòng)判斷是否正在發(fā)出跨子域名的請(qǐng)求,并選擇AJAX請(qǐng)求的方式。這樣,客戶端的異步通訊層就會(huì)對(duì)開發(fā)人員完全透明。世上還會(huì)有比這更令人愉快的事情嗎?:)



注意事項(xiàng)

  可能以下幾點(diǎn)值得一提:

我在出現(xiàn)這個(gè)想法之后也作了一些嘗試,最后發(fā)現(xiàn)創(chuàng)建XMLHttpRequest對(duì)象,調(diào)用open方法和send方法都必須在iframe中的頁面中執(zhí)行才能夠在IE和FireFox中成功發(fā)送AJAX請(qǐng)求。
在上面的例子中,我們向子域名請(qǐng)求的的路徑是http://sub0.test.com/Script.ashx。請(qǐng)注意,完整的子域名不可以省略,否則在FireFox下就會(huì)出現(xiàn)權(quán)限不夠的錯(cuò)誤,在調(diào)用open方法時(shí)就會(huì)拋出異?!坪鮂ireFox把它當(dāng)作了父頁面域名的資源了。
Windows Live Contacts Gadget使用了一種叫做Channel的技術(shù),用于解決跨任意域名傳遞數(shù)據(jù)的問題,我相當(dāng)佩服微軟技術(shù)人員的創(chuàng)造力。Channel技術(shù)是一種優(yōu)秀的解決跨域名異步請(qǐng)求問題的解決方案,而且如果將它封裝成了組件,那么使用起來也會(huì)相當(dāng)優(yōu)雅(似乎微軟已經(jīng)準(zhǔn)備這么做了)。不過它和我們現(xiàn)在需要解決的問題并不相同,如果有機(jī)會(huì)的話,我也會(huì)詳細(xì)的解釋一下Channel技術(shù)——但不是現(xiàn)在,因?yàn)槲矣X得我還沒有完全理解這個(gè)技術(shù)本身。

原文:
作者:趙劼 http://www.cnblogs.com/JeffreyZhao/archive/2007/02/02/Break_the_Browsers_Restrictions_6.html

相關(guān)文章

  • iframe式ajax調(diào)用示例代碼

    iframe式ajax調(diào)用示例代碼

    這篇文章主要介紹了iframe式ajax調(diào)用,需要的朋友可以參考下
    2014-05-05
  • Ajax亂碼問題整理

    Ajax亂碼問題整理

    Ajax亂碼問題整理...
    2006-09-09
  • Ajax實(shí)現(xiàn)文件下載

    Ajax實(shí)現(xiàn)文件下載

    本文給大家介紹ajax實(shí)現(xiàn)文件下載相關(guān)知識(shí),涉及到ajax文件下載方面的知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Ajax與用戶交互的JSON數(shù)據(jù)存儲(chǔ)格式

    Ajax與用戶交互的JSON數(shù)據(jù)存儲(chǔ)格式

    數(shù)據(jù)存儲(chǔ)是JavaScript的核心功能,適當(dāng)?shù)拇娣藕脭?shù)據(jù),就有利于我們組織起結(jié)構(gòu),又能使應(yīng)用程序稍后訪問這些內(nèi)容更加容易。這篇文章給大家介紹了Ajax與用戶交互的JSON數(shù)據(jù)存儲(chǔ)格式,感興趣的朋友一起看看吧
    2016-11-11
  • Ajax bootstrap美化網(wǎng)頁并實(shí)現(xiàn)頁面的加載刪除與查看詳情

    Ajax bootstrap美化網(wǎng)頁并實(shí)現(xiàn)頁面的加載刪除與查看詳情

    Bootstrap是Twitter推出的一個(gè)開源的用于前端開發(fā)的工具包,Bootstrap提供了優(yōu)雅的HTML和CSS規(guī)范,它即是由動(dòng)態(tài)CSS語言Less寫成。下面通過本文給大家介紹Ajax bootstrap美化網(wǎng)頁并實(shí)現(xiàn)頁面的加載刪除與查看詳情,需要的朋友可以參考下
    2017-03-03
  • 如何利用jQuery post傳遞含特殊字符的數(shù)據(jù)

    如何利用jQuery post傳遞含特殊字符的數(shù)據(jù)

    在jquery中,解決數(shù)據(jù)傳遞處理的方法我們通常利用$.ajax或$.post,但是這里這里通常不能傳遞特殊字符,比如說:“<”,本文就幫大家解決如何傳遞這種含特殊字符的數(shù)據(jù),感興趣的朋友一起看下吧
    2015-10-10
  • Ajax返回值類型與用法實(shí)例分析

    Ajax返回值類型與用法實(shí)例分析

    這篇文章主要介紹了Ajax返回值類型與用法,結(jié)合實(shí)例形式分析了ajax返回值的xml類型與文本類型詳細(xì)分類、用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • ajax以及一些亂碼問題

    ajax以及一些亂碼問題

    很就以前在使用AJAX的時(shí)候,那時(shí)候還不知道AJAX。于是在任務(wù)中被AJAX的亂碼問題搞的頭破血流。
    2010-08-08
  • Ajax request response 亂碼解決方法

    Ajax request response 亂碼解決方法

    今天最早遇到一個(gè)脫離平臺(tái),單獨(dú)給用戶定制開發(fā)的關(guān)于狀態(tài)管理的功能局部刷新出現(xiàn)亂碼的情況,仔細(xì)查了下代碼發(fā)現(xiàn)并無特殊之處,charset統(tǒng)一使用GB18030,ajax傳遞參數(shù)使用默認(rèn)UTF-8,對(duì)傳遞的中文信息手動(dòng)轉(zhuǎn)碼。
    2009-05-05
  • 防止重復(fù)發(fā)送Ajax請(qǐng)求的解決方案

    防止重復(fù)發(fā)送Ajax請(qǐng)求的解決方案

    這篇文章主要介紹了防止重復(fù)發(fā)送Ajax請(qǐng)求的解決方案,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論

南皮县| 芜湖县| 云林县| 博罗县| 敦煌市| 隆德县| 鱼台县| 潞城市| 唐海县| 宝兴县| 龙海市| 海晏县| 北京市| 綦江县| 琼中| 舒兰市| 鄱阳县| 华宁县| 峨边| 班玛县| 观塘区| 沈阳市| 新晃| 南宫市| 清徐县| 石河子市| 韶关市| 枣庄市| 招远市| 苏州市| 电白县| 新安县| 黄大仙区| 丹棱县| 成安县| 林芝县| 乐至县| 淮安市| 文山县| 贵溪市| 商水县|