Flex 沙箱跨域

最近一直在負責代碼重構與整理,實現先後端的分開部署,結果常常遇到這樣或那樣的問題,故整理一番,以備往後享餉。html

        首先因爲flex的自身安全性不太健全,容易被反編譯或注入,出於安全考慮,adobe公司設計的了沙箱安全訪問,這樣嚴格控制容許訪問的網站,這樣保證相對安全。那麼設置沙箱以後,又要訪問外部網絡,進行交互,就須要一個跨域文件。跨域文件是別人提供給flex的,而非flex自主自發的。這個設計思路一直沒有想明白是爲何?ajax

    flex的跨域文件crossdomain.xml,對於半路出家的人常常爲遇到沙箱安全問題,例以下圖json

而後網上不少種解決方案,其實也就是一種解決方案,說添加crossdomain.xml文件,而後設置相應的節點後端

site-control、allow-access-from、allow-access-from-identity、allow-http-request-headers-from

結果發現仍是不行,而後各類嘗試結果發現一場空,最後無心中發現了相應的解決辦法,如今就逐一說明過程和思路跨域

跨域

跨域,首先要明白什麼是跨域,就是訪問不一樣路徑下的文件,這裏的路徑涵蓋了邏輯和虛擬路徑,例如,不一樣IP,相同IP不一樣端口,本地和在線等等多種狀況tomcat

同源策略的保護,若是沒有同源策略的保護,那麼一些重要的機密網站將會很危險,來源於網絡安全

study.cn/json/jsonp/jsonp.html
 請求地址  形式  結果
 http://study.cn/test/a.html 同一域名,不一樣文件夾  成功
 http://study.cn/json/jsonp/jsonp.html 同一域名,統一文件夾  成功
 http://a.study.cn/json/jsonp/jsonp.html 不一樣域名,文件路徑相同  失敗
 http://study.cn:8080/json/jsonp/jsonp.html  同一域名,不一樣端口  失敗
 https://study.cn/json/jsonp/jsonp.html  同一域名,不一樣協議    失敗

根據這種狀況flex設計使用沙箱安全,經過crossdomain完成跨域操做。網絡

crossdomain.xml

關於crossdomain.xml跨域文件,就是xml文件,僅支持限定的標籤,具體參數就不說了,看下面的例子,針對http與https的差別dom

<?xml version="1.0"?> 
<!-- 此配置已停用 -->
<!-- <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> -->
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
	<!-- 測試中使用*號,在實際生產過程當中禁止使用*或All -->
	<!-- https 訪問請求 -->
<!-- 	<allow-access-from domain="*" secure="false" />
	<allow-http-request-headers-from domain="*" headers="*" secure="false" /> -->
	<!-- http 訪問請求 -->
	<allow-access-from domain="*"/>
	<allow-http-request-headers-from domain="*" headers="*" />
	<site-control permitted-cross-domain-policies="master-only" />
</cross-domain-policy>

跨域訪問

如今有了crossdomain.xml那麼跨域文件應該放在哪裏?怎麼加載?ide

加載

默認在進行跨域訪問時,flex會主動請求跨域目標的跨域文件,自動加載,或者能夠手動加載,前提是你設置的crossdomain.xml支持手動加載。

區分如下狀況確保可以正常跨域訪問

同機器跨域

    IP訪問---假定須要跨域訪問的資源在同一臺機器上,那麼crossdomain.xml放在網站的根目錄便可。

    域名訪問---須要跨域訪問的資源在同一臺機器上,可是有localhost和127.0.0.1相似的IP域名映射問題,就須要將crossdomain.xml放置域名對應的物理映射路徑上。

非同一臺機器

    不是同一臺就不用考慮那麼多問題了,首先要肯定目標機器或目標域的根目錄下是否有crossdomain.xml,若是有就能夠直接訪問。

    若是沒有,就本身設置IIS或tomcat,綁定相應的域名或IP、端口的信息,在其根目錄下設置crossdomain.xml文件,這樣就能夠訪問了

    若是沒有,本身也沒法操做目標機器的狀況,能夠繞過沙箱flex跨域訪問,其實就是使用新的技術棧訪問目標域,例如使用ajax技術訪問目標域,而後將結果送回給flex,不要直接使用flex訪問。能夠參考ExternalInterface的用法。

 

    差很少就是這麼多了,主要分清楚跨域文件到底應該放置在哪?肯定相應的路徑是否被設置有跨域文件。

 

參考

https://www.douban.com/note/506224583/

http://www.freebuf.com/articles/2950.html

http://blog.csdn.net/yoshikun/article/details/7700097

相關文章
相關標籤/搜索