这个问题应该不是新问题,今天折腾我几个小时了,查了很多文章,总结如下: 1.crossdomain.xml放在我http server的根目录 2.代码中加上Security.loadPolicyFile("http://myip/crossdomain.xml") 3.有人说crossdomain.xml服务端口必须大于1024,接着我把http server的port修改到8000 4.加了Security.allowDomain("*"); 其实我想根本不关它的事,也加上了. 以上的事情都做了,结果还是不行,一直在securityErrorHandler中报错,心都碎了,也许我的flashplayer太新了,没错,就是flashplayer10. 部分文章描述到 flashplayer 寻找crossdomain.xml的过程,说去843端口去询问,于是我决定自己验证下这个事情. 中间发现vista无法使用ethereal,结果用wildpacket这个工具进行网络抓包. flashplayer的确首先访问843端口,请求是<policy-file-request/>,最后面加个"/0",其实也就是0x00. 接着,发现843无法连接,就往应用端口送了,我的tcpserver是9850,所以flashplayer连接到我的tcpserver第一个内容报就发<policy-file-request/> 在这个过程中,并没有发现flashplayer有http的请求去访问/crossdomain.xml这样的资源,难道adobe文档骗人??? 现在很明显了,解决办法必须自己实现一个tcp socket去应付flashplayer的安全检查,要么在port 843做,要么在应用端口做,当然我不希望在判断我私有协议的时候去检查<policy-file-request/>这么一串东西。所以我还是用843做了。 因为我用mina框架,贴部分代码 主应用加 1.IoAcceptor acceptor = new SocketAcceptor(); 2. 3. try { 4. acceptor.bind( new InetSocketAddress(PORT), new FirHandler()); 5. } catch (IOException e) { 6. e.printStackTrace(); 7. System.exit(-1); 8. } 9./*以下是为处理843加的*/ 10. try { 11. acceptor.bind( new InetSocketAddress(843), new Flash843()); 12. } catch (IOException e) { 13. e.printStackTrace(); 14. System.exit(-1); 15. } 复制代码 Flash843实现如下: 1.package fir; 2. 3.import java.io.IOException; 4.import java.net.InetSocketAddress; 5. 6.import org.apache.mina.common.ByteBuffer; 7.import org.apache.mina.common.IdleStatus; 8.import org.apache.mina.common.IoAcceptor; 9.import org.apache.mina.common.IoHandlerAdapter; 10.import org.apache.mina.common.IoSession; 11.import org.apache.mina.common.TransportType; 12.import org.apache.mina.transport.socket.nio.SocketAcceptor; 13.import org.apache.mina.transport.socket.nio.SocketSessionConfig; 14. 15.public class Flash843 extends IoHandlerAdapter { 16. 17. public void sessionCreated(IoSession session) throws Exception { 18. System.out.println("From to " + session.getRemoteAddress().toString() + "Session created..."); 19. if( session.getTransportType() == TransportType.SOCKET ) 20. ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 ); 21. session.setIdleTime( IdleStatus.BOTH_IDLE, 10 ); 22. } 23. 24. public void exceptionCaught(IoSession session, Throwable t) throws Exception { 25. t.printStackTrace(); 26. session.close(); 27. } 28. 29. public void messageReceived(IoSession session, Object msg) throws Exception { 30. ByteBuffer get = (ByteBuffer)msg; 31. //System.out.println("Rec:" + get.getHexDump()); 32. String s = new String(get.buf().array()); 33. if (s.indexOf("<policy-file-request/>") != -1) 34. { 35. String res = "<?xml version=/"1.0/"?><cross-domain-policy><allow-access-from domain=/"*/" to-ports=/"*/"/></cross-domain-policy>/0"; 36. ByteBuffer resbb = ByteBuffer.wrap(res.getBytes()); 37. System.out.println("send 843"); 38. session.write(resbb); 39. return; 40. } 41. 42. } 43. 44. public void sessionOpened(IoSession session) throws Exception { 45. System.out.println("Session open.."); 46. } 47. public void sessionClosed(IoSession session) throws Exception { 48. System.out.println("Session close.."); 49. } 50. 51.} 注意,在回复的res中最后一定要加个"/0",其实也就是一个byte 0x00,我原来看抓包后门已经有几个填充0x00,但是不行,因为tcp包内容长度没有把填充部分加上,我想flashplayer在处理此包的时候必须碰到规定长度里的0x00才停止,然后再解析xml去设置沙箱安全。