当Flex访问Web服务请求(你的项目中某个serlvet等资源)时,在本地能够正常访问,当部署到web容器中发布为web服务后,再请求服务端的业务方法时候,此时就会被拒绝访问,Flex客户端会出现连接超时等问题,这就是Flex跨域访问的沙箱问题,为了解决Flex跨域访问web中的业务服务问题,可采用如下处理方法:
我们知道Flex跨域访问被拒绝是因为提供服务方没有配置安全策略文件,即crossdomain.xml,如果你不想用crossdomain.xml就要用到代理,即自己写一个后台读取webservice,然后提供给自己的flex客户端应用,因为在运行环境中,要Flex跨域必须要有策略文件。
以下是我项目应用的策略文件的写法格式:(当然这个文件内容可根据你项目的集体要求来配置相应的内容)
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYstem "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <!-- permitted-cross-domain-policies属性值 none 不允许使用 loadPolicyFile方法加载任何策略文件(包含主策略文件) master-only 只允许使用主策略文件,默认属性 by-content-type允许使用 loadPolicyFile方法加载http/https协议下Content-Type为text/x-cross-domain-policy的文件作为跨域策略文件 by-ftp-filename允许使用 loadPolicyFile 方法加载FTP协议下的文件名为 crossdomain .xml的文件作为跨域策略文件 --> <site-control permitted-cross-domain-policies="by-content-type" /> <allow-access-from domain="*" to-ports="*"/> <allow-http-request-headers-from domain="*" headers="*" /> </cross-domain-policy>
表示外部域可以依据策略文件设定的规则来访问该服务。crossdomain.xml的放置目录问题,可放置在:
1、如果放置crossdomain.xml目录是容器的根目录,那么可以通过以下的url访问crossdomain.xml:
http://localhost:8080/crossdomain.xml。
也就是说如果你的web应用部署在Tomcat的的话,请将crossdomain.xml文件放在webapps下的ROOT项目中即可。如果是其他web容器按照以上规则来定。
2、如果crossdomain.xml不是放在根目录下,而是在某个web应用程序下的话,在flex中就需要在初始化的时候调用一下方法:(这样就可以再同一个web容器下部署多个不一样的主策略规则,本人使用这方式自定义规则文件的位置)
Security.loadPolicyFile("http://localhost:8080/jplogic/crossdomain.xml");
其中jplogic为webapp的名称,可以根据自己项目名称来定
这样,在你项目中的动态页面(jsp.asp中嵌入Flex时候,当用户请求该资源的时候,那么这个时候如果jsp或者asp中的Flex需要请求其他站内资源(servlet)的时候就不会出现跨域访问问题了)。
如下是我在项目中关于该问题处理效果图: