分享Flash處理安全策略的經驗_Flash教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:Flash入門實例:制作傳統風格卷簾動畫本例為Flash鼠繪新手入門系列課程,今天我們來學習傳統風格卷簾畫的繪制,教程講解的比較詳細,適合Flash初學者學習,希望朋友們喜歡。 做了個簾畫,我把做的過程寫出來,供初學FLASHR 朋友們交流練習。 先看下效果吧: 一、畫簾片: 1.新建一圖形元件,名“
很多人在處理安全策略時遇到問題,我自己也總結了一些經驗,供大家參考吧.在 Flash Player 9.0.124.0 及以后的版本中,socket策略文件對于任何 Socket 連接都是必需的。也就是說,無論連接到哪一個端口(即使連接到提供 SWF 文件的同一主機上的端口),目標主機上都需要套接字策略文件。連接步驟:0.不論是低于還是高于1024端口,基于文件系統時都不會請求策略文件,基于網絡時才會請求.
1.首先發出以null結尾的<policy-file-request/>的消息,檢查服務器843端口是否有安全策略文件,策略文件格式為:
<cross-domain-policy>
<allow-access-from domain="*" to-ports="80-9000" />
</cross-domain-policy>
發回策略文件的時候必要以0結尾,如果843端口在3秒內沒有請求到策略文件或者to-ports配置的端口不允許鏈接,則斷掉鏈接拋securityError,這個是flash主動發起的.
2. 如果您的客戶端socket或xmlsocket連接中設置了Security.loadPolicyFile("xmlsocket://服務地址:應用端口"),則連接您的應用目標端口請求安全策略文件,請求和響應的方式如上,不設置是不會請求的.發請求是在調用connect之前.
3.如果您是http請求方式要設置Security.loadPolicyFile("http://服務地址/crossdomain.xml"),crossdomain.xml文件內容如上,放在網站根目錄就行了.例如mop的http://www.mop.com/crossdomain.xml
解決方案1:使用adobe官方提供的文件直接在服務器的843端口上建立服務,這樣響應速度最快,但對于應用的部署就麻煩了http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
解決方案2:客戶端必須加Security.loadPolicyFile("xmlsocket://服務地址:應用端口"),在服務端的應用端口上的私有協議上處理,一般的協議是長度 類型 數據,這樣判斷長度是0x3C70類型0x6C69,單獨處理這個消息,但對自己的私有協議處理還是有影響。
為什么是這樣的長度和類型看圖:

解決方案3:單獨在服務應用上處理843端口,和其他應用的服務剝離出來:
- //安全策略服務
- public void startPolicyServer() throws IOException{
- IoAcceptor acceptor = new NioSocketAcceptor();
- acceptor.setHandler(new PolicyServerHandler());
- acceptor.bind( new InetSocketAddress(843));
- System.out.println("安全策略服務偵聽端口:843");
- }
- //其他應用服務
- ..................
- ..................
- //單獨的安全策略處理器
- public class PolicyServerHandler extends IoHandlerAdapter {
- // 22字節 0占1個字節
- String security_quest = "<POLICY-FILE-REQUEST />";
- // 最后以0結尾
- String policyStr = "<CROSS-DOMAIN-POLICY>\r\n<ALLOW-ACCESS-FROM to-ports='\"80-9000\"' domain='\"*\"' />\r\n </CROSS-DOMAIN-POLICY>\r\n\0";
- private final Logger log = Logger.getLogger(PolicyServerHandler.class.getName());
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- IoBuffer processBuf = (IoBuffer) session.getAttribute("processBuf");
- processBuf.put((IoBuffer)message);
- processBuf.flip();
- if(getRequest(processBuf)){
- byte[] reps = policyStr.getBytes("UTF-8");
- IoBuffer rb = IoBuffer.allocate(reps.length);
- rb.put(reps);//也有putString方法
- rb.flip();
- session.write(rb);//發回
- log.info("send Policy");
- }
- }
- //獲得安全請求的字符串
- private Boolean getRequest(IoBuffer buf){
- String req = new String(buf.array());
- if (req.indexOf(security_quest) != -1){
- return true;
- }
- return false;
- }
- @Override
- public void messageSent(IoSession session, Object message) throws Exception {
- session.close(true);
- }
- @Override
- public void sessionClosed(IoSession session) throws Exception {
- super.sessionClosed(session);
- session.removeAttribute("processBuf");
- }
- @Override
- public void sessionCreated(IoSession session) throws Exception {
- super.sessionCreated(session);
- IoBuffer processBuf = IoBuffer.allocate(64);
- session.setAttribute("processBuf", processBuf);
- }
- }
備注:
1 mina2.x對比1.x效率更高,拋棄了原有的btyeBuffer,新寫了Iobuffer,原因如下:
It doesn't provide useful getters and putters such as fill, get/putString, and get/putAsciiInt() enough.
It is difficult to write variable-length data due to its fixed capacity
2 demux下DemuxingProtocolCodecFactory和MessageDecoder等功能更完善了,decodable判斷是否能解析數據,decode解析實際的數據,在處理私有協議上更簡單了
3 Flash10 socket類新增加timeout屬性指示建立連接時需等待的毫秒數
分享:Flash AS3制作火苗動畫實例教程這個例子做了有段時間了.但是也跟那時候發的AS2的純代碼火效果是一樣的,也是殘次品. 本次例子沒能做到減少系統資源的能力.剛做完這個效果以后.也查找了一些粒子方面的資料.看到了很多高人寫的粒子可以使用上千個粒子卻不占用更多的系統資源,高人.但是,如果能
相關Flash教程:
- 相關鏈接:
- 教程說明:
Flash教程-分享Flash處理安全策略的經驗
。