一種Flash跨域訪問數據的方法及裝置與流程
2023-05-12 12:29:36 1
本發明涉及計算機技術領域,特別涉及一種flash跨域訪問數據的方法及裝置。
背景技術:
目前,flash被廣泛的用於網頁設計和網頁動畫製作及網頁視頻播放等,大多數的視頻網站包括直播網站都採用flash做為其視頻播放器,並且大多數的網頁遊戲、大多數的郵箱等網頁應用程式都使用flash來開發一些功能,flash的具體使用文件是swf(shockwaveflash)文件,flash在設計之初從安全的角度考慮到了跨域(跨域指在一個網站域名下訪問另一個網站域名下的數據)的安全問題,因為跨域訪問一些文件或者資源有移動的危險性,該過程超過了網站自身的範圍,對於站外的資源無法審核其安全性。而對於一些跨域訪問的需求,flash提供了一種策略,通過配置策略文件crossdomain.xml文件來設置可以跨哪些域名來訪問數據,而如果對於某些網站的網站域名沒有在配置策略文件中進行配置是無法訪問其中的數據的。
技術實現要素:
本發明實施例提供了一種flash跨域訪問數據的方法及裝置,實現了跨域獲取數據的方法,提高了flash程序的靈活性和數據訪問的便捷性。
第一方面,本申請提供了一種flash跨域訪問數據的方法,所述方法包括:
編寫加載第一動畫文件的第二動畫文件,所述第一動畫文件為第三方網站域名下的動畫文件;
查找所述第二動畫文件具有的下載組件類及對應的下載組件接口;
在所述下載組件類中獲取下載所述第一動畫文件的目標下載組件類,將所述目標下載組件類實例化為實例化對象,所述實例化對象包括對應的下載組件接口;
調用所述實例化對象對應的目標下載組件接口,獲取所述第三方網站中的數據。
進一步的,所述編寫加載第一動畫文件的第二動畫文件的步驟,包括:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求第一動畫文件的接口;
調用所述接口加載所述第一動畫文件;
編寫所述回調函數。
進一步的,所述查找所述第二動畫文件具有的下載組件類及對應的下載組件接口的步驟,包括:
查找所述第二動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述第二動畫文件具有的下載組件類及對應的下載組件接口。
進一步的,所述在所述下載組件類中獲取下載所述第一動畫文件的目標下載組件類,將所述目標下載組件類實例化為實例化對象的步驟,具體包括:
調用類判斷接口判斷是否存在所述目標下載組件類;
若是,則調用類獲取接口獲取所述目標下載組件類;
根據所述目標下載組件類,創建所述目標下載組件類的實例化對象,確定所述實例化對象的下載組件接口。
進一步的,所述調用所述實例化對象對應的目標下載組件接口,獲取所述第三方網站中的數據的步驟,具體包括:
獲取所述實例化對象對應的目標下載組件接口,所述目標下載組件接口為用戶需要獲取所述第三方網站中數據的接口;
調用所述目標下載組件接口獲取所述第三方網站中的數據。
第二方面,本申請提供了一種flash跨域訪問數據的裝置,所述裝置包括:
編寫單元,用於編寫加載第一動畫文件的第二動畫文件,所述第一動畫文件為第三方網站域名下的動畫文件;
查找單元,用於查找所述第二動畫文件具有的下載組件類及對應的下載組件接口;
實例化單元,用於在所述下載組件類中獲取下載所述第一動畫文件的目標下載組件類,將所述目標下載組件類實例化為實例化對象,所述實例化對象包括對應的下載組件接口;
調用單元,用於調用所述實例化對象對應的目標下載組件接口,獲取所述第三方網站中的數據。
進一步的,所述編寫單元具體用於:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求第一動畫文件的接口;
調用所述接口加載所述第一動畫文件;
編寫所述回調函數。
進一步的,所述查找單元具體用於:
查找所述第二動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述第二動畫文件具有的下載組件類及對應的下載組件接口。
進一步的,所述實例化單元具體用於:
調用類判斷接口判斷是否存在所述目標下載組件類;
若是,則調用類獲取接口獲取所述目標下載組件類;
根據所述目標下載組件類,創建所述目標下載組件類的實例化對象,確定所述實例化對象的下載組件接口。
進一步的,所述調用單元具體用於:
獲取所述實例化對象對應的目標下載組件接口,所述目標下載組件接口為用戶需要獲取所述第三方網站中數據的接口;
調用所述目標下載組件接口獲取所述第三方網站中的數據。
本發明實施例中通過編寫加載第一動畫文件的第二動畫文件,查找所述第二動畫文件具有的下載組件類及對應的下載組件接口,在下載組件類中獲取下載第一動畫文件的目標下載組件類,將目標下載組件類實例化為實例化對象,調用實例化對象對應的目標下載組件接口,獲取第三方網站中的數據。本發明實施例通過編寫一個flash文件來加載第三方網站域名下的flash文件,然後通過反射機制獲取到該網站的下載組件接口,最後通過該下載組件接口來獲取所感興趣的內容。這樣通過編寫的flash文件去讓該網站域名下的flash文件去下載該網站的數據,實際實現下載的是該域名下的flash文件去下載,所以域名檢測判斷是同一個域名,從而實現了跨域獲取數據的方法,提高了flash程序的靈活性和數據訪問的便捷性。
附圖說明
圖1是本發明實施例中flash跨域訪問數據的方法的一個實施例示意圖;
圖2圖1所示實施例中步驟s1的具體實施例流程示意圖;
圖3圖1所示實施例中步驟s2的具體實施例流程示意圖;
圖4圖1所示實施例中步驟s3的具體實施例流程示意圖;
圖5圖1所示實施例中步驟s4的具體實施例流程示意圖;
圖6是本發明實施例中flash跨域訪問數據的裝置的一個實施例示意圖。
具體實施方式
為了使本技術領域的人員更好地理解本發明方案,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分的實施例,而不是全部的實施例。基於本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都應當屬於本發明保護的範圍。
本發明的說明書和權利要求書及上述附圖中的術語「第一」、「第二」等(如果存在)是用於區別類似的對象,而不必用於描述特定的順序或先後次序。應該理解這樣使用的數據在適當情況下可以互換,以便這裡描述的實施例能夠以除了在這裡圖示或描述的內容以外的順序實施。此外,術語「包括」和「具有」以及他們的任何變形,意圖在於覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統、產品或設備不必限於清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對於這些過程、方法、產品或設備固有的其它步驟或單元。
請參閱圖1,本發明實施例中flash跨域訪問數據的方法的一個實施例包括:
s1、編寫加載第一動畫文件的第二動畫文件;
其中,所述第一動畫文件為第三方網站域名下的動畫文件;第一動畫文件、第二動畫文件可以是swf文件。
s2、查找第二動畫文件具有的下載組件類及對應的下載組件接口;
由於動畫文件的格式是公開的,以swf文件為例,可以採取一些方式對swf文件進行查找,知道這個swf文件具有哪些類,保護哪些函數接口等。
s3、在下載組件類中獲取下載第一動畫文件的目標下載組件類,將目標下載組件類實例化為實例化對象;
其中,該實例化對象包括對應的下載組件接口。
s4、調用實例化對象對應的目標下載組件接口,獲取第三方網站中的數據。
本發明實施例中通過編寫加載第一動畫文件的第二動畫文件,查找所述第二動畫文件具有的下載組件類及對應的下載組件接口,在下載組件類中獲取下載第一動畫文件的目標下載組件類,將目標下載組件類實例化為實例化對象,調用實例化對象對應的目標下載組件接口,獲取第三方網站中的數據。本發明實施例通過編寫一個flash文件來加載第三方網站域名下的flash文件,然後獲取到該網站的下載組件接口,最後通過該下載組件接口來獲取所感興趣的內容,這樣通過編寫的flash文件去讓該網站域名下的flash文件去下載該網站的數據,實際實現下載的是該域名下的flash文件去下載,所以域名檢測判斷是同一個域名,從而實現了跨域獲取數據的方法,提高了flash程序的靈活性和數據訪問的便捷性。
如圖2所示,所述步驟s1具體可以包括:新建第二動畫文件,並在所述第二動畫文件中編寫代碼實現如下步驟:
s11、定義一個動畫文件加載實例;
具體的,仍以swf文件為例,可以首先定義一個actionscript的loader實例。而在actionscript中提供了一個loader類用來加載swf文件,或者是圖片jpg,gif動畫等文件。因此定義一個swf文件加載實例具體實現如下:
varswfloader:loader=newloader;
s12、註冊動畫文件加載完成的回調函數;
本步驟中仍以swf文件為例,在actionscript中提供了一個loader實例的接口,用來註冊加載完成事件,當loader加載完成一個swf文件後,會回調這個註冊的函數,以告訴它swf文件已經加載完成。在loader中提供了一個addeventlistener接口用來註冊事件。
接口具體原型如下:
addeventlistener(type:string,
listener:function,
usecapture:boolean=false,
priority:int=0,
useweakreference:boolean=false)
其中,第一個參數type:string用來表示註冊的事件類型,對應於本文則是event.complete,表示註冊swf加載完成事件;第二個參數listener:function用來表示註冊的完成事件完成後的回調函數,用於觸發回調函數執行;第三個參數priority:int用於標示事件的優先級,使用默認值0;第四個參數useweakreference:boolean指定回調函數是弱應用還是強引用,使用默認值false。
s13、創建請求第一動畫文件的接口;
仍以swf文件為例,創建請求動畫文件的接口即,創建請求swf的接口urlrequest,在actionscript提供接口用來從網絡或者本地請求一個swf文件,具體接口如下:
urlrequest(url:string=null)
其中,參數url:string標示傳入的url地址或者本地路徑。
s14、調用所述接口加載所述第一動畫文件;
在動畫文件為swf文件時,可以調用loader實例的接口來加載請求的swf文件,具體接口如下:
load(request:urlrequest,context:loadercontext=null)
其中,參數request:urlrequest就是加載的請求對象,就是步驟s13中創建的urlrequest對象。
s15、編寫所述回調函數。
編寫回調函數swfloadcompletehandler,此函數即是上面調用的註冊加載完成的回調函數。
進一步的,如圖3所示,上述步驟s2具體可以包括:
s21、查找所述第二動畫文件使用的符號;
其中,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
s22、通過反編譯工具讀取所述使用的符號,確定所述第二動畫文件具有的下載組件類及對應的下載組件接口。
由於swf文件的格式是公開的,很容易找到第三方的反編譯工具,可以對swf進行反編譯,swf文件會存儲所有使用的符號,比如會存儲所有的包名,所有的類名,所有的函數名和變量名等,那麼通過反編譯工具是可以讀取到這些名字,可以知道這個swf文件保護哪些類,哪些函數接口,從而可以為後續使用反射機制來獲取到這些類及接口。
其中,下載組件接口具有從網站中下載數據的方法,該類通常的實現如下:
1.定義一個數據下載對象。
publicvarurlloader:urlloader=newurlloader;
2.定義一個數據下載的接口。
publicfunctiondownload(url:string):void{
urlloader.load(newurlrequest(url));
...}
其中參數url:string則是需要下載的數據的網站url地址。通過傳入這個想要獲取數據的url地址則可以獲取任意想要獲取該網站的數據。其中urlloader則是執行具體的下載邏輯,數據下載完成後會存儲在urlloader中,通過訪問urlloader則可以獲取到下載的數據。只要從該網站的swf中找到上述的功能邏輯,則說明該swf是提供下載組件的,則可以利用該下載組件下載想要的數據。至此,通過這個步驟就實現了查找出一個swf文件中提供的數據下載接口。
進一步的,如圖4所示,上述步驟s3具體可以包括:
s31、調用類判斷接口判斷是否存在目標下載組件類,若是,則執行步驟s32;
s32、調用類獲取接口獲取目標下載組件類;
s33、根據目標下載組件類,創建目標下載組件類的實例化對象,確定所述實例化對象的下載組件接口。
仍以swf文件為例,首先在s1中我們通過loader的接口加載了一個第三方的swf文件,然後通過步驟s2的反編譯可以看到swf有哪些類包含有下載組件接口,進而可以通過反射機制獲取該下載組件接口來進行調用。先舉例假設swf有一個類名是classdownload,該類中有一個方法publicfunctiondownload(url:string):void{
urlloader.load(newurlrequest(url));
}
該方法則是用來傳入一個下載數據的地址,然後調用loader來下載數據。那麼可以通過反射機制則可以實例化classdownload的對象,並調用該下載數據的下載組件接口下載。那麼通過反射機制的具體調用方法是如下:
(1)先調用loader的接口判斷是否存在這個目標下載組件類。
通過loader的接口hasdefinition(上述類判斷接口)則可以判斷第三方swf是否具有這個目標類。原型如下:
hasdefinition(name:string):boolean
其中,參數name:string則是填入類的名字(目標下載組件類的名字),返回值則是true則存在,是false則不存在。調用如下:
varbdefine:boolean=swfloader.contentloaderinfo.applicationdomain.hasdefinition("classdownload");
其中,swfloader則是步驟s1中加swf的loader實例,參數"classdownload"則是假設存在這個類。返回值bdefine標示是否存在這個類。
(2)調用loader的接口獲取這個目標下載組件類。
通過loader的接口getdefinition(上述類獲取接口)則可以獲取到這個類。原型如下:
getdefinition(name:string):object
其中,參數name:string則是類的名字,返回值則是目標類。
varcclass:class=swfloader.contentloaderinfo.applicationdomain.getdefinition("classdownload")asclass;
其中swfloader則是步驟s1中加swf的loader實例,參數"classdownload"則是假設存在這個目標下載組件類。返回值cclass則是對應的classdownload這個目標下載組件類。
(3)實例化類的對象。
通過步驟(2)獲取到了類cclass後,可以通過其創建一個實例化對象,確定該實例化對象的接口。
具體如下:
varobj:cclass=newcclass;
這樣就創建了一個cclass的實例對象obj。至此,通過這個步驟就實現通過反射機制來創建一個目標下載組件類的實例化對象。
進一步的,如圖5所示,上述步驟s4具體可以包括:
s41、獲取實例化對象對應的目標下載組件接口;
其中,該目標下載組件接口為用戶需要獲取所述第三方網站中數據的接口;
s42、調用目標下載組件接口獲取所述第三方網站中的數據。
通過步驟s3創建了一個類的實例化對象obj,從而可以直接調用其目標下載組件接口的方法,來下載需要的數據。具體如下:
假設類cclass有一個接口download(url:string),接口有一個參數url,用於存放需要獲取的數據的url地址。則可以直接通過obj對象來調用。
varstrurl:string;比如是:http://test/userinfo
obj.download(strurl);
並在數據下載完成後,數據會存放在classdownload類中的成員變量urlloader中,那麼直接讀取其中的數據則是我們想要獲取的數據了。由於是通過自己編寫的swf文件去讓該第三方網站域名下的swf文件去下載該網站的數據,所以實際下載的是該域名下的swf文件去下載,所以域名檢測判斷是同一個域名,所以從而實現了跨域獲取數據的方法。
至此,通過這個步驟就實現了通過反射機制獲取到的下載組件類並調用其接口,從而可以比較方便的調用第三方網站域名下的swf的接口。
下面介紹本發明實施例中調用動畫數據的裝置的實施例。
請參閱圖6,為本發明實施例中flash跨域訪問數據的裝置的一個實施例示意圖,該實施例中,flash跨域訪問數據的裝置包括:
編寫單元601,用於編寫加載第一動畫文件的第二動畫文件,所述第一動畫文件為第三方網站域名下的動畫文件;
查找單元602,用於查找所述第二動畫文件具有的下載組件類及對應的下載組件接口;
實例化單元603,用於在所述下載組件類中獲取下載所述第一動畫文件的目標下載組件類,將所述目標下載組件類實例化為實例化對象,所述實例化對象包括對應的下載組件接口;
調用單元604,用於調用所述實例化對象對應的目標下載組件接口,獲取所述第三方網站中的數據。
進一步的,所述編寫單元601具體用於:
新建第二動畫文件,並在所述第二動畫文件中編寫代碼實現如下步驟:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求第一動畫文件的接口;
調用所述接口加載所述第一動畫文件;
編寫所述回調函數。
進一步的,所述查找單元602具體用於:
查找所述第二動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述第二動畫文件具有的下載組件類及對應的下載組件接口。
進一步的,所述實例化單元603具體用於:
調用類判斷接口判斷是否存在所述目標下載組件類;
若是,則調用類獲取接口獲取所述目標下載組件類;
根據所述目標下載組件類,創建所述目標下載組件類的實例化對象,確定所述實例化對象的下載組件接口。
進一步的,所述調用單元604具體用於:
獲取所述實例化對象對應的目標下載組件接口,所述目標下載組件接口為用戶需要獲取所述第三方網站數據的接口;
調用所述目標下載組件接口獲取所述第三方網站中的數據。
所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統,裝置和單元的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
在本申請所提供的幾個實施例中,應該理解到,所揭露的系統,裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特徵可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以採用硬體的形式實現,也可以採用軟體功能單元的形式實現。
所述集成的單元如果以軟體功能單元的形式實現並作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中。基於這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟體產品的形式體現出來,該計算機軟體產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,伺服器,或者網絡設備等)執行本發明各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:u盤、移動硬碟、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、磁碟或者光碟等各種可以存儲程序代碼的介質。
以上所述,以上實施例僅用以說明本發明的技術方案,而非對其限制;儘管參照前述實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分技術特徵進行等同替換;而這些修改或者替換,並不使相應技術方案的本質脫離本發明各實施例技術方案的精神和範圍。