存储本地数据

共享对象(有时称为“Flash cookie”)是一个数据文件,您访问的站点可能会在您的计算机上创建该文件。共享对象通常用于增强您的 Web 浏览体验 ― 例如,使用它可以个性化经常访问的网站的外观。共享对象本身不能对您计算机上的数据进行任何操作,也不能使用这些数据进行任何操作。更重要的是,共享对象永远不能访问或记住您的电子邮件地址或其它个人信息 ― 除非您愿意提供这样的信息。

可以使用静态的 SharedObject.getLocal()SharedObject.getRemote() 方法来创建新的共享对象实例。getLocal() 方法尝试加载仅对当前客户端可用的本地永久共享对象,而 getRemote() 方法则尝试加载可借助服务器(例如 Flash Media Server)跨多个客户端共享的远程共享对象。如果本地或远程共享对象不存在,则 getLocal()getRemote() 方法将创建一个新的 SharedObject 实例。

下面的代码尝试加载名为 test 的本地共享对象。如果此共享对象不存在,将新建一个具有此名称的共享对象。

var so:SharedObject = SharedObject.getLocal("test");
trace("SharedObject is " + so.size + " bytes");

如果找不到名为 test 的共享对象,则新建一个 0 字节大小的共享对象。如果已经存在该共享对象,则返回其当前大小(以字节为单位)。

您可以通过向数据对象分配值来在共享对象中存储数据,如以下示例所示:

var so:SharedObject = SharedObject.getLocal("test");
so.data.now = new Date().time;
trace(so.data.now);
trace("SharedObject is " + so.size + " bytes");

如果已经存在名为 test 的共享对象和参数 now,则会覆盖现有值。您可以使用 SharedObject.size 属性来确定共享对象是否已存在,如以下示例所示:

var so:SharedObject = SharedObject.getLocal("test");
if (so.size == 0)
{
    // 共享对象不存在。
    trace("created...");
    so.data.now = new Date().time;
}
trace(so.data.now);
trace("SharedObject is " + so.size + " bytes");

上面的代码使用 size 参数确定具有指定名称的共享对象实例是否已存在。如果测试下面的代码,您会注意到每次运行代码时,都会重新创建共享对象。为了将共享对象保存到用户的硬盘驱动器,您必须显式地调用 SharedObject.flush() 方法,如以下示例所示:

var so:SharedObject = SharedObject.getLocal("test");
if (so.size == 0)
{
    // 共享对象不存在。
    trace("created...");
    so.data.now = new Date().time;
}
trace(so.data.now);
trace("SharedObject is " + so.size + " bytes");
so.flush();

使用 flush() 方法将共享对象写入用户的硬盘时,应仔细检查用户是否已使用 Flash Player 设置管理器 (www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html) 显式禁用了本地存储,如下例所示:

var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();

可以在共享对象的 data 属性中指定属性名称以从共享对象检索值。例如,如果运行下面的代码,Flash Player 将显示 SharedObject 实例是在多少分钟前创建的:

var so:SharedObject = SharedObject.getLocal("test");
if (so.size == 0)
{
    // 共享对象不存在。
    trace("created...");
    so.data.now = new Date().time;
}
var ageMS:Number = new Date().time - so.data.now;
trace("SharedObject was created " + Number(ageMS / 1000 / 60).toPrecision(2) + " minutes ago");
trace("SharedObject is " + so.size + " bytes");
so.flush();

第一次运行上面的代码时,将创建一个名为 test 的新 SharedObject 实例,其初始大小为 0 字节。由于初始大小为 0 字节,if 语句的计算结果为 true,且一个名为 now 的新属性会添加到共享对象中。可以用当前时间减去 now 属性的值来计算共享对象的存在时间。以后每次运行上面的代码时,共享对象的大小都应大于 0,且该代码将跟踪共享对象是在多少分钟前创建的。

子主题

显示共享对象的内容
创建安全 SharedObject

显示共享对象的内容

值存储在共享对象中的 data 属性中。可以使用 for..in 循环来循环访问共享对象实例中的每个值,如以下示例所示:

var so:SharedObject = SharedObject.getLocal("test");
so.data.hello = "world";
so.data.foo = "bar";
so.data.timezone = new Date().timezoneOffset;
for (var i:String in so.data)
{
    trace(i + ":\t" + so.data[i]);
}

创建安全 SharedObject

当使用 getLocal()getRemote() 创建本地或远程 SharedObject 时,有一个名为 secure 的可选参数,该参数确定对此共享对象的访问是否限于通过 HTTPS 连接传递的 SWF 文件。如果此参数设置为 true 且 SWF 文件是通过 HTTPS 传递的,Flash Player 将新建一个安全共享对象,或者获取对现有安全共享对象的引用。此安全共享对象只能由通过 HTTPS 传递的 SWF 文件来读取或写入,SWF 文件将调用 SharedObject.getLocal() 并将 secure 参数设置为 true。如果此参数设置为 false 且 SWF 文件是通过 HTTPS 传递的,Flash Player 将新建一个共享对象,或者获取对现有共享对象的引用。

还可由通过非 HTTPS 连接传递的 SWF 文件对此共享对象进行读取或写入。如果 SWF 文件是通过非 HTTPS 连接传递的,并且您尝试将此参数设置为 true,将无法创建新的共享对象(或访问以前创建的安全共享对象),并会引发错误,并且共享对象设置为 null。如果尝试通过非 HTTPS 连接运行以下代码片段,SharedObject.getLocal() 方法将引发错误:

try
{
    var so:SharedObject = SharedObject.getLocal("contactManager", null, true);
}
catch (error:Error)
{
    trace("Unable to create SharedObject.");
}

无论此参数为何值,创建的共享对象的数量都接近域所允许的磁盘空间的总量。


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000319.html