分享Flash处理安全策略的经验_Flash教程

编辑Tag赚U币
教程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端口,和其他应用的服务剥离出来:
  1. //安全策略服务
  2. public void startPolicyServer() throws IOException{
  3. IoAcceptor acceptor = new NioSocketAcceptor();
  4. acceptor.setHandler(new PolicyServerHandler());
  5. acceptor.bind( new InetSocketAddress(843));
  6. System.out.println("安全策略服务侦听端口:843");
  7. }
  8. //其他应用服务
  9. ..................
  10. ..................
  11. //单独的安全策略处理器
  12. public class PolicyServerHandler extends IoHandlerAdapter {
  13. // 22字节 0占1个字节
  14. String security_quest = "<POLICY-FILE-REQUEST />";
  15. // 最后以0结尾
  16. String policyStr = "<CROSS-DOMAIN-POLICY>\r\n<ALLOW-ACCESS-FROM to-ports='\"80-9000\"' domain='\"*\"' />\r\n </CROSS-DOMAIN-POLICY>\r\n\0";
  17. private final Logger log = Logger.getLogger(PolicyServerHandler.class.getName());
  18. public void messageReceived(IoSession session, Object message)
  19. throws Exception {
  20. IoBuffer processBuf = (IoBuffer) session.getAttribute("processBuf");
  21. processBuf.put((IoBuffer)message);
  22. processBuf.flip();
  23. if(getRequest(processBuf)){
  24. byte[] reps = policyStr.getBytes("UTF-8");
  25. IoBuffer rb = IoBuffer.allocate(reps.length);
  26. rb.put(reps);//也有putString方法
  27. rb.flip();
  28. session.write(rb);//发回
  29. log.info("send Policy");
  30. }
  31. }
  32. //获得安全请求的字符串
  33. private Boolean getRequest(IoBuffer buf){
  34. String req = new String(buf.array());
  35. if (req.indexOf(security_quest) != -1){
  36. return true;
  37. }
  38. return false;
  39. }
  40. @Override
  41. public void messageSent(IoSession session, Object message) throws Exception {
  42. session.close(true);
  43. }
  44. @Override
  45. public void sessionClosed(IoSession session) throws Exception {
  46. super.sessionClosed(session);
  47. session.removeAttribute("processBuf");
  48. }
  49. @Override
  50. public void sessionCreated(IoSession session) throws Exception {
  51. super.sessionCreated(session);
  52. IoBuffer processBuf = IoBuffer.allocate(64);
  53. session.setAttribute("processBuf", processBuf);
  54. }
  55. }

备注:

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教程/更新时间:2009-04-01
相关Flash教程