最近一直在負責代碼重構與整理,實現先後端的分開部署,結果常常遇到這樣或那樣的問題,故整理一番,以備往後享餉。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跨域文件,就是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/