一直对flash 的安全域 和 crossdomain 比较迷惑。
由于之前开发flash一直是在同一个域下开发的,也不会出现问题,但是在线上环境,由于各种资源的位置不同,
就会产生一系列问题。
痛定思痛,花时间理解透吧。
假定: A 域下的 main.swf 调用 B域下的 module.swf
1、如果 仅仅是按资源调用,即不会访问被加载者的数据。这个的话,main.swf不需要任何的授权就可以访问module.swf
2、如果 是要使用 module.swf 中的数据的话,module.swf 里面必须 Security.allowDomain("A");
但是介于加载 module 的方式不同又有所区别。
a、加载到一个新的应用域或者当前域的子域的话,LoaderContext 只需要声明 applicationDomain 即可,
其他不需要授权,但是这种方法取 module 中的 数据(class)的话,必须保存 loadInfo ,然后由loadInfo
中的Application 域来获取 class。
b、加载到当前应用域的话,即想在取 module 数据(class)的时候,不需用加载时候保存的loadInfo,通过
Application.currentDomain 即可取 数据。切记,这个时候要声明 LoaderContext 的 安全域 为 当前安全域,
即 context.securityDomain = SecurityDomain.currentDomain;,因为涉及到了当前安全域的授权性,所以
B域下 要 为 A域 做 crossdomain 授权。
到此对应用程序的 安全域 和 应用程序域有了比较深刻的了解。
安全域 可以理解成和网站域名相对应的一个域,只要域之间涉及到 跨域操作,无论 图片,swf,还是视频
都要在 crossdomain 中 声明。
adobe 官方对 crossdomain 的解释是:
位图、声音和视频中的数据
加载 XML 和文本文件
将 SWF 文件从其它安全域导入到执行加载的 SWF 文件所在的安全域
对套接字和 XML 套接字连接的访问
所以只要设计到安全域的问题 都要在 crossdomain 声明。
在安全域的前提下,swf 又有额外的授权限制,只module.swf 通过Security.allowDomain 对 A域授权了,
A才能访问 module 中的数据,同理,main 也可对 module 授权。
另外
Security.sandboxType 安全沙箱 应该是安全域父类,因为安全域的概念只是在
remote
(Security.REMOTE
)下才有意义。
在安全域下面又有 应用程序域,可以理解成在一个网站下面 有 很多 程序,这些程序有些是继承关系,有些是共享关系,
有些是封闭关系,有产生了 子域加载,同域加载,和新域加载。
另外安全沙箱 的 全部类型:
remote
(Security.REMOTE
):此文件来自 Internet URL,并在基于域的沙箱规则下运行。 localWithFile
(Security.LOCAL_WITH_FILE
):此文件是本地文件,尚未受到用户信任,且不是使用网络名称进行发布的 SWF 文件。此 文件可以从本地数据源读取数据,但不能与 Internet 进行通信。 localWithNetwork
(Security.LOCAL_WITH_NETWORK
):此 SWF 文件是本地文件,尚未受到用户信任,且已使用网络名称进行发布。此 SWF 文件可与 Internet 通信,但不能从本地数据源读取数据。 localTrusted
(Security.LOCAL_TRUSTED
):此文件是本地文件,并且用户已经使用 Flash Player“设置管理器”或 FlashPlayerTrust 配置文件将其设置为受信任的文件。此 文件既可以从本地数据源读取数据,也可以与 Internet 进行通信。 application
(Security.APPLICATION
):此文件在 AIR 应用程序中运行,并且随该应用程序的包(AIR 文件)一起安装。默认情况下,AIR 应用程序沙箱中的文件可以跨脚本访问任何域中的任何文件(尽管不允许 AIR 应用程序沙箱以外的文件跨脚本访问 AIR 文件)。默认情况下,AIR 应用程序沙箱中的文件可以加载任何域中的内容和数据。
未完待续。。。。。