最近在項目中遇到flex跨域訪問的安全沙箱問題,查資料了解到需要在服務端加上crossdomain.xml文件,即:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
但對於具體存放在web服務的那個目錄下,一直困惑不已,最終發現,這需存放在你服務器的默認站點目錄下,一般情況下,目錄站點都是Root;tomcat中存放在
webapps/ROOT/ 下,即所謂的根目錄;jboss存放目錄也很類似,也是放在默認站點root目錄下,以我機器為例,存放在:C:\jboss-4.0.5.GA\server\default\deploy\jbossweb-tomcat55.sar\ROOT.war中的Root.war中;
倘若你的tomcat 或者jboss中沒有默認站點Root,那crossdomain.xml需要放在哪里呢?
兩種處理辦法:1.拷貝一個Root站點到你的tomcat或者jboss中,再在其中加入crossdomain.xml;
2.如果你的tomcat或者jboss的默認站點已經設置成了其他的應用,則你需要將crossdomain.xml放置到這些個具體的默認站點中去;
一言以蔽之,crossdomain.xml需要存放在你默認站點的根目錄下,檢驗你的crossdomain.xml是否放置正確,你可以通過用http://domainname/crossdomain.xml這種方式訪問即可(切記不要加應用名),以我機器為例:
http://127.0.0.1:8080/crossdomain.xml,如果可以訪問到到該xml 就可以了。
當然在這個過程中我不得不再提醒你一個很值得你注意的地方:在做所有工作之前請把你的瀏覽器緩存clear掉,因為我在實踐當中該死的緩存幾乎差點讓我懷疑自己,差點讓我不知所措!
ps: adobe默認的策略文件還提供了另一種訪問機制,即他可以用Security.loadPolicyFile方法加載指定目錄下的crossdomain,但是在某個版本后,就要求在服務器根目錄下必須有crossdomain文件了,官方文檔解釋如下:
SWF 文件可以通過調用 Security.loadPolicyFile() 方法檢索其它策略文件名或其它目錄位置。但是,如果主策略文件未指定目標位置能提供策略文件,則調用loadPolicyFile() 無效,即使該位置有策略文件。
http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08.html
因此,如果你的站點訪問存在安全沙箱問題,無論如何你的默認站點下都需要放置crossdomain.xml