共享对象

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

Flash Player 提供使用“共享对象”的功能,这些对象是永久位于 SWF 文件外部的 ActionScript 对象,它们或者位于用户的本地文件系统中,或者位于远程 RTMP 服务器上。共享对象与 Flash Player 中的其他媒体相似,也划分到安全沙箱中。但是,共享对象的沙箱模型稍有不同,因为共享对象不是可以跨域边界访问的资源,而是始终从共享对象存储区获得的资源,该存储库特定于调用 SharedObject 类的方法的每个 SWF 文件的域。通常,共享对象存储区比 SWF 文件所在的域更精确:默认情况下,每个 SWF 文件使用特定于其整个源 URL 的共享对象存储区。有关共享对象的详细信息,请参阅共享对象

SWF 文件可以使用 SharedObject.getLocal()SharedObject.getRemote() 方法的 localPath 参数,以便使用仅与其部分 URL 关联的共享对象存储区。这样,SWF 文件可以允许与其他 URL 的其他 SWF 文件共享。即使将 '/' 作为 localPath 参数传递,仍然会指定特定于其自身所在域的共享对象存储区。

用户可通过使用“Flash Player 设置”对话框或“设置管理器”来限制共享对象访问。默认情况下,可以将共享对象创建为每个域最多可以保存 100 KB 的数据。管理用户和用户还可限制写入文件系统的能力。有关详细信息,请参阅管理员控制用户控制

可以通过为 SharedObject.getLocal() 方法或 SharedObject.getRemote() 方法的 secure 参数指定 true 来指定共享对象是安全的。请注意有关 secure 参数的以下说明:

  • 如果此参数设置为 true,则 Flash Player 将创建一个新的安全共享对象或获取一个对现有安全共享对象的引用。只可由通过 HTTPS 传递的 SWF 文件对此安全共享对象进行读取或写入,而该 HTTPS 调用 SharedObject.getLocal() 并将 secure 参数设置为 true

  • 如果此参数设置为 false,则 Flash Player 将创建一个新的共享对象或获取一个对现有共享对象的引用,可以通过非 HTTPS 连接传递的 SWF 文件对此共享对象或现有共享对象的引用进行读取或写入。

如果执行调用的 SWF 文件不是来自 HTTPS URL,则为 SharedObject.getLocal() 方法或 SharedObject.getRemote() 方法的 secure 参数指定 true 会导致 SecurityError 异常。

对共享对象存储区的选择基于 SWF 文件的源 URL。即使在导入加载和动态加载这两种情况下也是如此,这时 SWF 文件不是源自简单的 URL。导入加载是指在 LoaderContext.securityDomain 属性设置为 SecurityDomain.currentDomain 时加载 SWF 文件。在这种情况下,被加载的 SWF 文件将具有一个伪 URL,该 URL 以执行加载的 SWF 文件所在的域开头,后跟实际的源 URL。动态加载是指使用 Loader.loadBytes() 方法加载 SWF 文件。在这种情况下,被加载的 SWF 文件将具有一个伪 URL,该 URL 以执行加载的 SWF 文件的完整 URL 开头,后跟一个整数 ID。在导入加载和动态加载这两种情况下,都可以使用 LoaderInfo.url 属性检查 SWF 文件的伪 URL。选择共享对象存储区时,可将该伪 URL 完全视为真实的 URL。可以指定使用部分或全部伪 URL 的共享对象 localPath 参数。

用户和管理员可以选择禁止使用“第三方共享对象”。当在 Web 浏览器中执行的任何 SWF 文件的源 URL 与浏览器地址栏中显示的 URL 属于不同的域时,该 SWF 文件可以使用这样的共享对象。用户和管理员可以出于隐私原因选择禁止使用第三方共享对象,从而可以避免跨域跟踪。为避开这种限制,可能希望确保使用共享对象的任何 SWF 文件都只在 HTML 页面结构内部进行加载,这样可以确保 SWF 文件位于浏览器的地址栏中所示的同一个域中。试图使用第三方 SWF 文件中的共享对象时,如果第三方共享对象禁止使用,则 SharedObject.getLocal()SharedObject.getRemote() 方法将返回 null。有关详细信息,请访问 www.adobe.com/cn/products/flashplayer/articles/thirdpartylso