Almacenamiento de datos locales



Un objeto compartido, a menudo referido como “cookie de Flash”, es un archivo de datos que se puede crear en el equipo a partir de los sitios que se visitan. Los objetos compartidos se utilizan sobre todo para mejorar la navegación en Web ya que, por ejemplo, permiten personalizar el aspecto de un sitio Web que se visita con frecuencia. Los objetos compartidos, por sí mismos, no actúan de ningún modo con los datos del equipo. Y lo que es más importante, los objetos compartidos nunca pueden acceder a direcciones de correo electrónico u otra información personal, ni recordar estos datos, a menos que el usuario proporcione conscientemente dicha información.

Para crear nuevas instancias de objetos compartidos, se utilizan los métodos estáticos SharedObject.getLocal() o SharedObject.getRemote(). El método getLocal() intenta cargar localmente un objeto compartido persistente que sólo está disponible para el cliente actual, mientras que el método getRemote() intenta cargar un objeto compartido remoto que puede compartirse entre varios clientes a través de un servidor como Flash Media Server. Si el objeto compartido local o remoto no existe, los métodos getLocal() y getRemote() crearán una nueva instancia de SharedObject.

El código siguiente intenta cargar un objeto compartido local denominado test. Si este objeto compartido no existe, se creará un nuevo objeto compartido con este nombre.

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

Si no se encuentra un objeto compartido denominado test, se crea uno nuevo con un tamaño de 0 bytes. Si el objeto compartido ya existía previamente, se devuelve su tamaño real, en bytes.

Para almacenar datos en un objeto compartido, hay que asignar valores al objeto de datos, como se muestra en el siguiente ejemplo:

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

Si ya hay un objeto compartido con el nombre test y el parámetro now, se sobrescribe el valor existente. Se puede utilizar la propiedad SharedObject.size para determinar si un objeto compartido ya existe, como se muestra en el siguiente ejemplo:

var so:SharedObject = SharedObject.getLocal("test"); 
if (so.size == 0) 
{ 
    // Shared object doesn't exist. 
    trace("created..."); 
    so.data.now = new Date().time; 
} 
trace(so.data.now); 
trace("SharedObject is " + so.size + " bytes");

El código anterior utiliza el parámetro size para determinar si ya existe la instancia de objeto compartido con el nombre especificado. Si se prueba el siguiente código, se observará que, cada vez que se ejecuta, se vuelve a crear el objeto compartido. Para guardar un objeto compartido en el disco duro del usuario, debe llamarse de forma explícita al método SharedObject.flush(), como se muestra en el siguiente ejemplo:

var so:SharedObject = SharedObject.getLocal("test"); 
if (so.size == 0) 
{ 
    // Shared object doesn't exist. 
    trace("created..."); 
    so.data.now = new Date().time; 
} 
trace(so.data.now); 
trace("SharedObject is " + so.size + " bytes"); 
so.flush();

Cuando se utiliza el método flush() para escribir objetos compartidos en el disco duro de un usuario, es necesario comprobar si el usuario ha desactivado de forma explícita el almacenamiento local a través del Administrador de configuración de Flash Player (www.macromedia.com/support/documentation/es/flashplayer/help/settings_manager07.html), tal y como se muestra en el siguiente ejemplo:

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

Para recuperar valores de un objeto compartido, se debe especificar el nombre de la propiedad en la propiedad data del objeto compartido. Por ejemplo, si se ejecuta el siguiente código, Flash Player mostrará los minutos transcurridos desde que se creó la instancia de SharedObject:

var so:SharedObject = SharedObject.getLocal("test"); 
if (so.size == 0) 
{ 
    // Shared object doesn't exist. 
    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();

La primera vez que se ejecuta el código anterior, se creará una instancia de SharedObject denominada test, que tendrá un tamaño inicial de 0 bytes. Dado que el tamaño inicial es 0 bytes, la sentencia if da como resultado true y se añade una nueva propiedad denominada now al objeto compartido local. La antigüedad del objeto compartido se calcula restando el valor de la propiedad now de la hora actual. Cada vez que vuelve a ejecutarse el código anterior, el tamaño del objeto compartido debe ser mayor que 0 y el código averigua cuántos minutos han transcurrido desde que se creó el objeto compartido.

Visualización del contenido de un objeto compartido

Los valores se almacenan en los objetos compartidos dentro de la propiedad data. Puede repetir indefinidamente todos los valores de una instancia de objeto compartido utilizando un bucle for..in, tal y como se muestra en el siguiente ejemplo:

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]); 
}

Creación de un objeto SharedObject seguro

Cuando se crea una instancia de SharedObject local o remota mediante getLocal() o getRemote(), hay un parámetro opcional denominado secure que determina si el acceso a este objeto compartido queda restringido a los archivos SWF enviados a través de una conexión HTTPS. Si el valor de este parámetro es true y el archivo SWF se envía a través de HTTPS, Flash Player crea un nuevo objeto compartido seguro u obtiene una referencia a un objeto compartido seguro existente. Sólo pueden leer o escribir en este objeto compartido seguro los archivos SWF enviados a través de HTTPS que llamen a SharedObject.getLocal() con el parámetro secure establecido en true. Si el valor de este parámetro es false y el archivo SWF se envía a través de HTTPS, Flash Player crea un nuevo objeto compartido u obtiene una referencia a un objeto compartido existente.

Los archivos SWF enviados mediante conexiones no HTTPS pueden leer o escribir en este objeto compartido. Si un archivo SWF se ha enviado a través de una conexión no HTTPS y se intenta establecer este parámetro en true, no se podrá crear un nuevo objeto compartido (o acceder a un objeto compartido seguro creado anteriormente), se emitirá un error y el objeto compartido se establecerá en null. Si se intenta ejecutar el siguiente fragmento de código desde una conexión no HTTPS, el método SharedObject.getLocal() emitirá un error:

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

Independientemente del valor de este parámetro, los objetos compartidos creados aumentan el espacio en disco total permitido en el dominio.