发布者许可(政策文件):
创建政策文件:
- <? xml version ="1.0" ?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- < cross-domain-policy >
- < allow-access-from domain ="domainOrIP" />
- < allow-access-from domain ="*.example.com" />
- < allow-access-from domain ="*" />
- < allow-access-from domain ="localhost" />
- </ cross-domain-policy >
- "*"符号表示给所有源头 授权。
- 为了包含本地范围 作为一个授权源头,一个政策文件必须通过为domain属性指定 * 来显式地信任所有的源头。
- domain指定的IP 和他们等价域名 是不同的 。
公布政策文件:
- 默认的 名字和位置:名字:crossdomain.xml ;位置:网站的根目录
- 如果政策文件在网站根目录 中,它授权对整个网站的访问权 。
- 如果政策文件在网站的一个子目录 中,它授权对该目录及子目录的访问权 ,此时需要手工装载这个政策文件 :
- Security.loadPolicyFile("http://domainOrIP/pathToPolicyFile" );
Security.loadPolicyFile("http://domainOrIP/pathToPolicyFile");
取得一个政策文件的许可来装载数据 :
Xml代码
- <? xml version ="1.0" ?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- < cross-domain-policy >
- < allow-access-from domain ="www.site-b.com" />
- < allow-access-from domain ="site-b.com" />
- </ cross-domain-policy >
- var urlloader:URLLoader = new URLLoader();
- urlloader.load(new URLRequest("http://site-a.com/assets/file.xml" ));
var urlloader:URLLoader = new URLLoader();
urlloader.load(new URLRequest("http://site-a.com/assets/file.xml"));
取得一个政策文件的许可来把内容作为数据访问 :
- <? xml version ="1.0" ?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- < cross-domain-policy >
- < allow-access-from domain ="www.site-b.com" />
- < allow-access-from domain ="site-b.com" />
- </ cross-domain-policy >
- var loaderContext = new LoaderContext();
- loaderContext.checkPolicyFile = true ;
- theLoader.load(new URLRequest("http://site-a.com/assets/image.jpg" , loaderContext));
- trace(theLoader.content);
var loaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
theLoader.load(new URLRequest("http://site-a.com/assets/image.jpg", loaderContext));
trace(theLoader.content);
使用一个政策文件来授 权套接字连接 :
- <? xml version ="1.0" ?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- < cross-domain-policy >
- < allow-access-from domain ="www.site-b.com" to-ports ="3000" />
- < allow-access-from domain ="site-b.com" to-ports ="3000" />
- </ cross-domain-policy >
- var socket:Socket = new Socket();
- try
- {
- socket.connect("site-a.com" , 3000 );
- }
- catch (e:SecurityError)
- {
- trace("Connection problem" );
- trace(e.message);
- }
var socket:Socket = new Socket();
try {
socket.connect("site-a.com", 3000);
} catch (e:SecurityError) {
trace("Connection problem");
trace(e.message);
}
1. 端口范围 :
to-ports="9100, 9200"
to-ports="10000-11000"
to-ports="*"
2. 如果一个政策文件时取自小于1024 端口的一个套接字,* 表示对任何端口的访问都被授权
如果一个政策文件取自大于或者等于1024 端口的一个套接字,* 表示对于任何大于或者等于1024端口的访问都被授权
3. 当一个政策文件在和所需的套接字连接的不同端口 提供服务时,必须手工装载那个政策文件 ,添加以下语句:
- Security.loadPolicyFile("xmlsocket://domainOrIP:portNumber" );
Security.loadPolicyFile("xmlsocket://domainOrIP:portNumber");
基于HTTP的政策文件:
必须满足的条件:
- 它必须被命名为crossdomain.xml
- 它必须放置于网页服务器的根目录 中
- 它必须在所需要的套接字连接的域名 或IP地址的端口80 上提供服务
- 在AS3中,它必须通过Security.loadPolicyFile()来手工装载
创建者许可(allowDomian()):
- Security.allowDomain("www.sometvnetwork.com" , "sometvnetwork.com" );
- Security.allowDomain("*" );
Security.allowDomain("www.sometvnetwork.com", "sometvnetwork.com");
Security.allowDomain("*");
- 只作用于交叉脚本控制 和HTML-to-SWF脚本控制 操作
- * 符号不能 用作一个子域名 的通配符 :Security.allowDomain("*.example.com ");不行的
- 一个.swf文件可以通过检查被装载的.swf文件的LoaderInfo 对象中的childAllowsParent 变量来判定它是否被授权
导入装载:swf装载swf
如果两个swf来自不同的远程区域 ,或者不同的安全沙箱类型,使用下面的方法加载
- var loaderContext:URLLoader = new URLLoader();
- // 仅当加载AS3编写的SWF文件时才会使用此属性
- loaderContext.applicationDomain = ApplicationDomain.currentDomain;
- loaderContext.securityDomain = SecurityDomain.currentDomain;
- loader.load(new URLRequest("http://site-a.com/assets/file.swf" ), loaderContext);
var loaderContext:URLLoader = new URLLoader();
// 仅当加载AS3编写的SWF文件时才会使用此属性
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
loaderContext.securityDomain = SecurityDomain.currentDomain;
loader.load(new URLRequest("http://site-a.com/assets/file.swf"), loaderContext);
处理安全违规:
要么抛出一个SecurityError 异常,要么调度一个SecurityErrorEvent .SECURITY _ERROR
- var urlloader:URLLoader = new URLLoader();
- urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorListener);
- urlloader.load(".../index.xml" );
var urlloader:URLLoader = new URLLoader();
urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorListener);
urlloader.load(".../index.xml");
有时需要注册LoaderInfo 的事件监听:
- var loader:Loader = new Loader();
- loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorListener);