摘要:下面介紹第二種方法降子域通信不支持時降子域通信不支持時,降子域通信由于和都是屬于下的子域,同源策略在前端頁面中判定依據是而不是。
歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~
本文由MarsBoy發表于云+社區專欄
| 導語 Web技術飛速發展的如今,我們在感受新技術帶來的便捷和喜悅的同時,也時常在考慮著一個問題:老技術如何遷移。正如本文的主題一樣,Flash技術在早年風靡在Web領域,曾經發揮著無盡力量的一個工具正逐漸失去了其重要性。由于性能,兼容性,版權問題,Flash的市場正在消退,曾經靠Flash實現的功能和特性如何完美得進行遷移呢,本文將簡單談一談Flash的幾個常見的特性的替代方案。
我們知道Flash可以播放.swf文件的動畫視頻,而且具有很強的控制功能,以前很多Web視頻播放器都是基于Flash去實現的。包括embed標簽,都是如此。所有視頻源為swf的文件的視頻都需要借助Flash去播放。
在移動端設備上,使用HTML5的video標簽基本沒有問題。 在PC上,IE低版本(IE8-)瀏覽器上除了Flash目前沒有其它辦法 在PC上,IE9+和其它現在瀏覽器,采用HTML5標簽。 綜合來說,可以統一用以下一段代碼實現兼容:
目前在PC端a.qq.com的頁面請求b.qq.com的一個接口是理論上跨域的一個請求,舊版本瀏覽器特別是只支持XMLHTTPRequest Level1的瀏覽器,需要訪問跨域請求,要么使用jsonp,要么只能使用Flash。 使用Flash進行跨域需要做的事情是
1.a.qq.com的js與Flash交互 2.Flash校驗安全性,檢查b.qq.com下根目錄的crossDomain.xml文件的控制訪問屬性 3.Flash作為中間代理請求b.qq.com 4.Flash將請求結果返回給a.qq.com的js 圖1簡明扼要的描述了這個過程。
圖1 Flash跨域請求
條件:要使用CORS,必須在支持XmlHttpRequest Level2的瀏覽器中(IE10+和其它現代瀏覽器) 做法:設置withCredentials頭,然后結合后臺設置的Access-Control-Allow-Origin頭進行控制,進行跨域即可。相關代碼如下: 前端JS:
$.ajax({
url:"http://b.qq.com/api/xxx.php",
type:"POST",
xhrFields:{
withCredentials:true
},
success:function(){
//...
},
fail:function(){
//...
}
})
后端PHP:
我們回到同源策略,如果要請求b.qq.com下的一個接口,我們從b.qq.com下的頁面發起請求,是遵循同源策略的。那么我們可以在接口域名下放一個統一的html文件,用于代理我們請求b.qq.com的接口,然后將結果告訴a.qq.com就可以了。 這種情況下要解決2個主要問題: 1.cookie如何發送 2.a.qq.com與b.qq.com的代理頁面前端通信 其實兩個問題是一個問題,a.qq.com下的cookie我們是可以獲取到的,同樣的cookie我們可以種在b.qq.com下的。問題歸結到第二個問題,如何在前端實現a.qq.com和b.qq.com兩個頁面之間的通信。 有兩個方法:
主要核心邏輯代碼可以參考: 【a.qq.com頁面代碼】
【b.qq.com頁面代碼】
以上demo簡單解決了前端跨域通信,跨域帶cookie等問題,在邏輯上完全可以實現跨域通信。但是對于不支持PostMessage特性的老版瀏覽器是行不通的。比如IE8-瀏覽器就不能很好的支持PostMessage特性。這種情況下我們采用另外一種中轉跨域的方案:降子域通信。 下面介紹第二種方法:降子域通信:
由于a.qq.com和b.qq.com都是屬于qq.com下的子域,同源策略在前端頁面中判定依據是document.domain而不是location.host。而document.domain可寫,可以人為更改到其父域名。這樣a.qq.com和b.qq.com的兩個頁面都可以自行降到qq.com。這樣就可以直接進行通信。 主要核心邏輯代碼可以參考: 【a.qq.com頁面代碼】
【b.qq.com頁面代碼】
在實際改造過程中,如果后端結果過多,或者改造不方便,可以直接采用第二種方式——中轉代理的方式進行改造。其原理示意圖總結如下:
圖2 去Flash跨域請求改造指導圖
其實文件上傳是HTML規范內的,理論上不需要使用Flash去做。但是隨著ajax技術的興起,Web 2.0時代的到來,input表單的提交改成ajax提交,頁面無刷新的形式。但是這種形式下對于文件這類二進制文件無法提交,IE下本來有ActiveX 的FSO可以操作,但是插件的執行需要IE安全機制允許,很多情況下用戶體驗不好,而且兼容性也不是很好。于是這種背景下,FLash又擔當起了一個新的功能:文件上傳。 著名的jquery插件,ajaxupload.js就是用的Flash進行文件提交。
如何不使用Flash,上傳文件,而且保證頁面不刷新,是我們在去Flash上傳工作中需要做的核心。下面針對不同的瀏覽器提供兩套方案:
條件:支持HTML5 FileReader 和FormData 特性 做法:
1.獲取input表單的files對象 2.實例化FileReader對象,并解析files對象 3.解析之后輸出base64編碼的文件數據 4.base64的數據傳入FormData 5.ajax提交FormData
參考demo如下:
條件:無任何條件,支持任何瀏覽器 做法:
1.在頁面上構建一個隱藏的iframe 2.在頁面上構建一個form表單,表單中包含文件表單和其它附加字段表單,target設為上述iframe的id 3.上傳文件動作觸發時,調用form的submit方法 4.iframe中加載上傳cgi,返回結果與父窗口通信,如果iframe與cgi跨域,則參考【第二部分:跨域請求】進行處理
參考demo如下:
DEMO-上傳文件
總結
本文給出了筆者在實際工作中遇到的最常見的去Flash改造的三種場景,現以表格的形式簡單概括如下:
現代H5 | 早期低版本IE等 | |
---|---|---|
視頻播放 | 使用H5的video標簽 | 沒辦法只能使用FLash,如果不用Flash,建議提醒用戶升級瀏覽器 |
跨域提交請求 | 使用CORS,前后端結合 | 中轉代理(PostMessage或者降域) |
Ajax文件上傳 | 使用FileReader+FormData封裝 | 模擬表單提交到iframe |
結語
去Flash不僅是對實現方案的一種兼容改造,更是對早已成熟的新技術新思路的運用。目前而言,不管是因為政策原因,還是因為性能或者其它兼容性原因,去Flash改造都是重要和緊迫的,本文是筆者在實際工作過程中總結出的最常見的三種去Flash場景和改造方案,供參考,不足之處還請不吝指正。
相關閱讀
再論 ASP.NET 中獲取客戶端IP地址
從零開始的Spring Session
【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識
此文已由作者授權騰訊云+社區發布,更多原文請點擊
搜索關注公眾號「云加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在云加社區!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/1692.html
摘要:還有一個值得關注的是加密媒體擴展標準其支持用原生和開發播放加密視頻。專業流媒體發布商將無法依靠微軟的技術在和安卓設備上的火狐來加密自己的內容。因此,不同的系統組合,如用于和安卓的,用于和的,還有用于的。 英文原文:HTML5 Media Source Extensions: Bringing Production Video To The Web 在過去的十幾年,像Flash和Silv...
摘要:還有一個值得關注的是加密媒體擴展標準其支持用原生和開發播放加密視頻。專業流媒體發布商將無法依靠微軟的技術在和安卓設備上的火狐來加密自己的內容。因此,不同的系統組合,如用于和安卓的,用于和的,還有用于的。 英文原文:HTML5 Media Source Extensions: Bringing Production Video To The Web 在過去的十幾年,像Flash和Silv...
摘要:和格式的瀏覽器兼容性移動端因為蘋果公司對的強烈抵制以及自己定的視頻協議,所以在端原生支持格式的視頻播放而不支持的播放,而且因為蘋果在移動端的領頭作用,所以其他移動端包括瀏覽器也都原生支持格式的視頻播放。 因為誤打誤撞來到了淘寶直播團隊,從開始完全不了解直播技術,現在因為leader暫時的離開,準備接手h5播放器的迭代,就不得不開始了解相關的視頻技術,先整理一下在直播技術中的視頻格式和不...
閱讀 1785·2023-04-26 00:47
閱讀 1543·2021-11-11 16:55
閱讀 2597·2021-09-27 14:04
閱讀 3548·2021-09-22 15:58
閱讀 3554·2021-07-26 23:38
閱讀 2129·2019-08-30 13:47
閱讀 1979·2019-08-30 13:15
閱讀 1142·2019-08-29 17:09