專利名稱:跨域獲取數(shù)據(jù)的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)頁間獲取數(shù)據(jù)的技術(shù),尤其涉及跨域獲取數(shù)據(jù)的方法和系統(tǒng)。
背景技術(shù):
目前,網(wǎng)絡(luò)上的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)大多采用可擴(kuò)展標(biāo)識語言(XML)加以描述并保存在網(wǎng)絡(luò)(web)服務(wù)器中,用XML描述的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)通過web服務(wù)器的頁面處理邏輯以網(wǎng)頁的形式通過客戶端瀏覽器呈現(xiàn)出來。
對于數(shù)據(jù)的加載和頁面的呈現(xiàn),傳統(tǒng)的web應(yīng)用允許用戶向web服務(wù)器發(fā)送請求,web服務(wù)器接受并處理請求,應(yīng)用頁面處理邏輯返回新的網(wǎng)頁。參見圖1,圖1是傳統(tǒng)web模式下數(shù)據(jù)加載和頁面呈現(xiàn)的結(jié)構(gòu)示意圖。如圖1所示,客戶端用戶打開瀏覽器瀏覽網(wǎng)頁,欲瀏覽新的網(wǎng)頁時,向web服務(wù)器端發(fā)送超文本傳輸協(xié)議(Http)請求,web服務(wù)器收到Http請求后,調(diào)用所存儲的數(shù)據(jù)并對數(shù)據(jù)進(jìn)行頁面呈現(xiàn)的邏輯處理,然后將經(jīng)過處理得到的超文本鏈接標(biāo)示語言(HTML)代碼和頁面呈現(xiàn)的相關(guān)需要在同一個響應(yīng)中發(fā)送給客戶端,客戶端瀏覽器根據(jù)web服務(wù)器發(fā)送的響應(yīng)顯示新的頁面。
然而,由于前后兩個頁面中的大部分HTML代碼是相同的,發(fā)送這些沒有改變的信息將占用帶寬;另外,web服務(wù)器處理數(shù)據(jù)的時候,用戶處于等待狀態(tài),處理完后返回新的頁面時,用戶仍然需要等待,所以這種數(shù)據(jù)加載和頁面呈現(xiàn)的方式響應(yīng)時間長,速度慢,浪費帶寬資源。
于是,業(yè)界提出一種采用異步Java腳本(JavaScript)和XML(AJAX)的方式來實現(xiàn)web應(yīng)用。AJAX是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù),使用XMLHttpRequest對象進(jìn)行異步數(shù)據(jù)查詢、檢索,通過XMLHttpRequest對象直接向web服務(wù)器發(fā)送請求并取回所需要的數(shù)據(jù),并在客戶端采用JavaScript處理來自web服務(wù)器的響應(yīng)。其中,XMLHttpRequest對象是目前大多數(shù)瀏覽器都支持并提供的用來直接發(fā)送Http請求并接受遠(yuǎn)程服務(wù)器響應(yīng)數(shù)據(jù)的對象,是AJAX獲取遠(yuǎn)程數(shù)據(jù)的核心。
參見圖2,圖2是AJAX模式下數(shù)據(jù)加載和頁面呈現(xiàn)的結(jié)構(gòu)示意圖。如圖2所示,在客戶端瀏覽器中增加了AJAX引擎,由它實現(xiàn)頁面呈現(xiàn)的任務(wù),使得web服務(wù)器可以專注于處理數(shù)據(jù)??蛻舳擞脩衾肵MLHttpRequest對象發(fā)起Http請求,web服務(wù)器收到Http請求后只返回所請求的XML數(shù)據(jù),客戶端界面調(diào)用JavaScript處理web服務(wù)器所返回的XML數(shù)據(jù),呈現(xiàn)新的網(wǎng)頁。可見,web服務(wù)器更為迅速地響應(yīng)用戶的請求,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒有改變的信息。
以上描述了同域情況下數(shù)據(jù)加載和頁面呈現(xiàn)的過程,同域是指數(shù)據(jù)都保存在同一web服務(wù)器上,例如前后頁面所使用的數(shù)據(jù)都保存在163.com服務(wù)器上,而對于一些集成的web應(yīng)用來說,往往有很多個域,例如bbs.163.com,mail.163.com等,對于這些不同域的數(shù)據(jù)常常需要進(jìn)行統(tǒng)一的處理和呈現(xiàn),于是就出現(xiàn)數(shù)據(jù)跨域應(yīng)用的問題。目前,通常采用web服務(wù)器代理的解決方案解決跨域應(yīng)用的問題。
參見圖3,圖3是現(xiàn)有技術(shù)跨域獲取數(shù)據(jù)的示意圖。如圖3所示,客戶端用戶正在利用瀏覽器瀏覽的頁面A為http://a1.b.com/a.html,其屬于a1.b.com域,數(shù)據(jù)B為http://a2.b.com/b.xml,屬于a2.b.com域,保存在a2.b.com的web服務(wù)器上,正在瀏覽頁面A的用戶希望獲取數(shù)據(jù)B,并在本域上以頁面A所需的頁面呈現(xiàn)邏輯將數(shù)據(jù)B呈現(xiàn)出來,于是用戶向頁面A所屬域的web服務(wù)器上發(fā)送一個Http請求,即向a1.b.com的web服務(wù)器發(fā)送Http請求,a1.b.com的web服務(wù)器收到Http請求后,向a2.b.com的web服務(wù)器索取數(shù)據(jù)B,并發(fā)給客戶端,客戶端界面調(diào)用JavaScript處理web服務(wù)器所返回的數(shù)據(jù)B,并呈現(xiàn)出來。
這種跨域獲取數(shù)據(jù)的方法具有以下缺點第一,頁面A與自身web服務(wù)器需要有一定的約定,以便在瀏覽頁面A的用戶發(fā)送請求時,web服務(wù)器可以了解頁面A所請求的數(shù)據(jù)在哪個域上,對于該約定需要嚴(yán)格遵守和維護(hù),成本高;第二,頁面A所屬域的web服務(wù)器上需要配置數(shù)據(jù)B所屬域的web服務(wù)器相關(guān)內(nèi)容,以實現(xiàn)web服務(wù)器之間的跨域訪問,這無疑也增加了配置維護(hù)成本;第三,對于數(shù)據(jù)B實際上傳輸了兩次,即從a2.b.com的web服務(wù)器到a1.b.com的web服務(wù)器,又從a1.b.com的web服務(wù)器到呈現(xiàn)頁面A的瀏覽器,所以浪費了帶寬,并且由于兩次傳輸中的任何一次出錯都會導(dǎo)致該數(shù)據(jù)的獲取失敗,所以出錯的可能性也增大。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提出一種跨域獲取數(shù)據(jù)的方法,可以低成本地解決跨域獲取數(shù)據(jù)的問題,具體地,該方法包括在第一頁面中嵌入與第一頁面所屬域的后綴相同且與第一頁面所需獲取的數(shù)據(jù)的所屬域相同的代理頁面,所述第一頁面通過所述代理頁面獲取所需數(shù)據(jù)。
優(yōu)選地,在所述嵌入代理頁面之前,該方法進(jìn)一步包括判斷第一頁面中是否嵌入了代理頁面,如果是,則直接通過代理頁面獲取數(shù)據(jù);否則,執(zhí)行所述嵌入步驟。在所述判斷之前,該方法進(jìn)一步包括向第一頁面所需獲取數(shù)據(jù)所屬的網(wǎng)絡(luò)服務(wù)器發(fā)送獲取數(shù)據(jù)的請求。
優(yōu)選地,所述通過代理頁面獲取數(shù)據(jù)具體包括第一頁面和代理頁面分別將自身所屬的域設(shè)置成域的后綴,第一頁面調(diào)用代理頁面的數(shù)據(jù)請求對象獲取數(shù)據(jù)。
優(yōu)選地,所述在第一頁面中嵌入代理頁面具體包括動態(tài)創(chuàng)建內(nèi)嵌式頁面,將內(nèi)嵌式頁面的地址指向代理頁面的地址,拉取代理頁面嵌入當(dāng)前頁面中。
優(yōu)選地,所述在第一頁面中嵌入代理頁面與通過代理頁面獲取數(shù)據(jù)之間,該方法進(jìn)一步包括創(chuàng)建回調(diào)隊列,將在代理頁面嵌入第一頁面過程中第一頁面獲取與數(shù)據(jù)同域的其它數(shù)據(jù)的請求以及獲取數(shù)據(jù)后需要進(jìn)行的邏輯處理存放到回調(diào)隊列中。在所述獲取數(shù)據(jù)之后,該方法進(jìn)一步包括依次處理所述回調(diào)隊列中的邏輯處理和請求。
另外,本發(fā)明還提出一種跨域獲取數(shù)據(jù)的系統(tǒng),包括欲獲取與自身所屬域后綴相同的數(shù)據(jù)的第一頁面,該系統(tǒng)進(jìn)一步包括與數(shù)據(jù)所屬域相同且嵌入第一頁面中的代理頁面,所述代理頁面用于根據(jù)第一頁面的請求獲取數(shù)據(jù)并將數(shù)據(jù)發(fā)送給第一頁面。
優(yōu)選地,該系統(tǒng)進(jìn)一步包括回調(diào)隊列,用于保存第一頁面發(fā)送的同域數(shù)據(jù)請求和邏輯處理。
優(yōu)選地,所述數(shù)據(jù)為一個以上保存在后綴與第一頁面所屬域相同的服務(wù)器上的數(shù)據(jù),且每個代理頁面與具有相同所屬域的一個或一個以上的數(shù)據(jù)相對應(yīng)。
從以上技術(shù)方案可以看到,本發(fā)明提供的跨域獲取數(shù)據(jù)的方法和系統(tǒng)具有以下有益效果相比于通過web服務(wù)器作為代理進(jìn)行數(shù)據(jù)獲取的方法,由于本發(fā)明提供的方案直接在欲獲取數(shù)據(jù)的頁面中嵌入與數(shù)據(jù)同域且與頁面所屬域后綴相同的代理頁面,利用代理頁面獲取數(shù)據(jù),所以成本低、實現(xiàn)容易且簡單,只需要在被獲取數(shù)據(jù)的web服務(wù)器上配置一個代理頁面即可,不需要額外的約定和維護(hù),因此配置和維護(hù)的成本也較低。
圖1是傳統(tǒng)web模式下數(shù)據(jù)加載和頁面呈現(xiàn)的結(jié)構(gòu)示意圖;圖2是AJAX模式下數(shù)據(jù)加載和頁面呈現(xiàn)的結(jié)構(gòu)示意圖;圖3是現(xiàn)有技術(shù)跨域獲取數(shù)據(jù)的示意圖;圖4是本發(fā)明實施例跨域獲取數(shù)據(jù)的流程圖。
具體實施例方式
為了使本發(fā)明的特征和優(yōu)點更加清楚明白,下面參照附圖結(jié)合具體實施例對本發(fā)明作進(jìn)一步的描述。
在AJAX模式下,根據(jù)同域原則,XMLHttpRequest對象要受到瀏覽器跨域的限制,也就是說,屬于a1.b.com域的客戶端瀏覽器不能利用XMLHttpRequest對象請求屬于a2.b.com域上的數(shù)據(jù),雖然數(shù)據(jù)不能跨域訪問,但是對于頁面A訪問頁面B,同域原則提供了一種特例頁面可以調(diào)用腳本將自己的域**.b.com設(shè)置成b.com,即調(diào)用腳本將自己的域設(shè)置成自己域的后綴,于是,對于頁面Ahttp://a1.b.com/a.html和頁面Bhttp://a2.b.com/b.html,可以分別調(diào)用腳本將域設(shè)置成b.com,這樣頁面A和頁面B就可以互相訪問,屬于a1.b.com域的客戶端瀏覽器也就可以通過調(diào)用屬于a2.b.com域的XMLHttpRequest對象獲取屬于a2.b.com域的數(shù)據(jù)。
本發(fā)明利用同域原則的這一特例,在a2.b.com的web服務(wù)器上保存一個a2.b.com域下的代理頁面,該代理頁面的作用僅是獲取a2.b.com域上的數(shù)據(jù),并不對數(shù)據(jù)執(zhí)行頁面呈現(xiàn)的處理邏輯。當(dāng)頁面A需要獲取a2.b.com域上的數(shù)據(jù)B時,首先根據(jù)同域原則的特例拉取代理頁面,然后由代理頁面獲取同域下的數(shù)據(jù)B,頁面A再通過訪問代理頁面獲取數(shù)據(jù)B,從而實現(xiàn)頁面A跨域獲取數(shù)據(jù)。具體參見圖4,圖4是本發(fā)明實施例跨域獲取數(shù)據(jù)的流程圖。
首先,在數(shù)據(jù)B所屬的a2.b.com的web服務(wù)器上預(yù)先保存代理頁面C,代理頁面C為http://a2.b.com/proxy.html,該代理頁面可以獲取到a2.b.com的web服務(wù)器上所保存的數(shù)據(jù),但不對數(shù)據(jù)執(zhí)行頁面呈現(xiàn)的處理邏輯。
進(jìn)一步地,頁面A所需獲取的數(shù)據(jù)可以為一個以上,所需獲取數(shù)據(jù)的所屬域與頁面A的所屬域的后綴相同。對應(yīng)的代理頁面也為一個以上,每個代理頁面都可以與自身所屬域相同的一個或一個以上的數(shù)據(jù)相對應(yīng),并且保存在對應(yīng)數(shù)據(jù)所屬域的web服務(wù)器上。接下來,跨域獲取數(shù)據(jù)的步驟具體如下步驟401、用戶在頁面A上向數(shù)據(jù)B所屬的web服務(wù)器發(fā)送獲取數(shù)據(jù)B的請求;在一些集成的web應(yīng)用中,通常包含多個域,客戶端在瀏覽其中一個域名下的頁面時,可能還希望訪問其它域名下的數(shù)據(jù),但是不必要鏈接到其它域名下的頁面上,也就是說,只需要獲得其它域名下的數(shù)據(jù)即可,這時,客戶端向數(shù)據(jù)所屬的web服務(wù)器發(fā)送獲取數(shù)據(jù)的請求。在本實施例中,客戶端用戶在瀏覽頁面Ahttp://a1.b.com/a.html時,欲訪問非本域名下的但域名后綴相同的數(shù)據(jù)B,則向數(shù)據(jù)B所屬的web服務(wù)器即a2.b.com的web服務(wù)器發(fā)送獲取請求。這里,頁面A也可以稱為第一頁面。
步驟402、判斷頁面A中是否已經(jīng)嵌入了代理頁面C,如果是,執(zhí)行步驟404-405;否則,執(zhí)行步驟403;步驟403、動態(tài)創(chuàng)建iframe,拉取代理頁面C嵌入頁面A中,并將頁面A獲取數(shù)據(jù)B后需要進(jìn)行的邏輯處理以及所發(fā)起的獲取數(shù)據(jù)B所在域下的其它數(shù)據(jù)的請求存放到一個預(yù)設(shè)的回調(diào)隊列中;iframe是一種內(nèi)嵌式頁面技術(shù),可以在一個頁面中嵌入另一個頁面,這一步驟即是動態(tài)創(chuàng)建iframe,將iframe的地址指向代理頁面C的地址,拉取a2.b.com的web服務(wù)器上保存的代理頁面C,嵌入頁面A中,代理頁面拉取成功后,可以進(jìn)一步通知頁面A已經(jīng)拉取完成,這時可以通過設(shè)置變量或者調(diào)用回調(diào)函數(shù)來通知頁面A。在將代理頁面C嵌入頁面A的過程中,頁面A可能發(fā)起對a2.b.com域下的其它數(shù)據(jù)的請求,而且頁面A還將對所獲取的數(shù)據(jù)B進(jìn)行邏輯處理,這時可以將這些請求和邏輯處理一并放到一個預(yù)先設(shè)置的回調(diào)隊列中,便于頁面A在拉取代理頁面C成功后,依次對回調(diào)隊列中的內(nèi)容進(jìn)行處理?;卣{(diào)隊列可以至少包括以下信息所需要獲取的數(shù)據(jù)、獲取數(shù)據(jù)成功后需要進(jìn)行的邏輯處理。
可見,創(chuàng)建回調(diào)隊列是為了避免在嵌入代理頁面時遺漏了對該域其它數(shù)據(jù)的請求,這是一種較佳的實施方式,實際應(yīng)用中也可以不用創(chuàng)建回調(diào)隊列。
另外,采用iframe嵌入代理頁面也僅是嵌入代理頁面的一種方式,其它嵌入代理頁面的方式同樣適用于本發(fā)明。
步驟404、代理頁面C和頁面A調(diào)用腳本,分別將自己的域設(shè)置成域的后綴。
代理頁面C為http://a2.b.com/proxy.html,頁面A為http://a1.b.com/a.html它們調(diào)用腳本執(zhí)行document.domain=“b.com”后,代理頁面C和頁面A就將自己的域都設(shè)置成了b.com。經(jīng)過這一步驟后,代理頁面C和頁面A就可以互相訪問了。
步驟405、頁面A調(diào)用代理頁面C所屬的a2.b.com域的XMLHttpRequest對象,獲取數(shù)據(jù)B。
步驟406、依次處理回調(diào)隊列中的邏輯處理和請求。
以上結(jié)合圖4描述了頁面A在請求獲取數(shù)據(jù)B時動態(tài)創(chuàng)建iframe拉取代理頁面并通過代理頁面獲取數(shù)據(jù)B的過程,事實上,如果頁面A可以預(yù)先知道需要獲取哪些域上的數(shù)據(jù),那么還可以直接把這些域的代理頁面嵌入頁面A中,這樣就不用在請求數(shù)據(jù)時才動態(tài)創(chuàng)建iframe拉取代理頁面,也不用創(chuàng)建回調(diào)隊列保存拉取代理頁面過程中進(jìn)行的處理。
從以上步驟可以看到,本發(fā)明實施例提供的方法是在數(shù)據(jù)B所屬的web服務(wù)器上預(yù)先保存一個代理頁面,頁面A通過iframe將代理頁面嵌入頁面A中,然后利用同域原則的特例實現(xiàn)頁面A與代理頁面C的互相訪問,通過代理頁面C獲取數(shù)據(jù)B??梢?,本發(fā)明的方案實現(xiàn)簡單、成本低。
以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種跨域獲取數(shù)據(jù)的方法,其特征在于,該方法包括在第一頁面中嵌入與第一頁面所屬域的后綴相同且與第一頁面所需獲取的數(shù)據(jù)的所屬域相同的代理頁面,所述第一頁面通過所述代理頁面獲取所需數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述嵌入代理頁面之前,該方法進(jìn)一步包括判斷第一頁面中是否嵌入了代理頁面,如果是,則直接通過代理頁面獲取數(shù)據(jù);否則,執(zhí)行所述嵌入步驟。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在所述判斷之前,該方法進(jìn)一步包括向第一頁面所需獲取數(shù)據(jù)所屬的網(wǎng)絡(luò)服務(wù)器發(fā)送獲取數(shù)據(jù)的請求。
4.根據(jù)權(quán)利要求1、2或3所述的方法,其特征在于,所述通過代理頁面獲取數(shù)據(jù)具體包括第一頁面和代理頁面分別將自身所屬的域設(shè)置成域的后綴,第一頁面調(diào)用代理頁面的數(shù)據(jù)請求對象獲取數(shù)據(jù)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在第一頁面中嵌入代理頁面具體包括動態(tài)創(chuàng)建內(nèi)嵌式頁面,將內(nèi)嵌式頁面的地址指向代理頁面的地址,拉取代理頁面嵌入當(dāng)前頁面中。
6.根據(jù)權(quán)利要求1、2或3所述的方法,其特征在于,所述在第一頁面中嵌入代理頁面與通過代理頁面獲取數(shù)據(jù)之間,該方法進(jìn)一步包括創(chuàng)建回調(diào)隊列,將在代理頁面嵌入第一頁面過程中第一頁面獲取與數(shù)據(jù)同域的其它數(shù)據(jù)的請求以及獲取數(shù)據(jù)后需要進(jìn)行的邏輯處理存放到回調(diào)隊列中。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,在所述獲取數(shù)據(jù)之后,該方法進(jìn)一步包括依次處理所述回調(diào)隊列中的邏輯處理和請求。
8.一種跨域獲取數(shù)據(jù)的系統(tǒng),其特征在于,包括欲獲取與自身所屬域后綴相同的數(shù)據(jù)的第一頁面,該系統(tǒng)進(jìn)一步包括與數(shù)據(jù)所屬域相同且嵌入第一頁面中的代理頁面,所述代理頁面用于根據(jù)第一頁面的請求獲取數(shù)據(jù)并將數(shù)據(jù)發(fā)送給第一頁面。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,該系統(tǒng)進(jìn)一步包括回調(diào)隊列,用于保存第一頁面發(fā)送的同域數(shù)據(jù)請求和邏輯處理。
10.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述數(shù)據(jù)為一個以上保存在后綴與第一頁面所屬域相同的服務(wù)器上的數(shù)據(jù),且每個代理頁面與具有相同所屬域的一個或一個以上的數(shù)據(jù)相對應(yīng)。
全文摘要
本發(fā)明公開了一種跨域獲取數(shù)據(jù)的方法,該方法包括在第一頁面中嵌入與第一頁面所屬域的后綴相同且與第一頁面所需獲取數(shù)據(jù)的所屬域相同的代理頁面,所述第一頁面通過所述代理頁面獲取數(shù)據(jù)。本發(fā)明還同時公開了一種跨域獲取數(shù)據(jù)的系統(tǒng),該系統(tǒng)包括欲獲取與自身所屬域后綴相同的數(shù)據(jù)的第一頁面,以及與數(shù)據(jù)所屬域相同且嵌入第一頁面中的代理頁面,該代理頁面用于根據(jù)第一頁面的請求獲取數(shù)據(jù)并將數(shù)據(jù)發(fā)送給第一頁面。本發(fā)明提供的方案可以低成本地實現(xiàn)跨域獲取數(shù)據(jù),并且方案簡單,實現(xiàn)容易。
文檔編號H04L29/02GK101075240SQ20061011184
公開日2007年11月21日 申請日期2006年8月25日 優(yōu)先權(quán)日2006年8月25日
發(fā)明者胡振勇, 張禹, 姜杰, 黃希彤, 陳子舜 申請人:騰訊科技(深圳)有限公司