¿Cuándo caducan los elementos del almacenamiento local HTML5?


¿Durante cuánto tiempo están disponibles los datos almacenados en localStorage (como parte del Almacenamiento DOM en HTML5)? ¿Puedo establecer un tiempo de caducidad para los datos que pongo en localStorage?

Author: TRiG, 2010-02-24

14 answers

Según John Resig, no es posible especificar la caducidad. Depende completamente del usuario.

Http://ejohn.org/blog/dom-storage /

editar - obviamente, su propia aplicación puede eliminar activamente cosas si decide que es demasiado viejo. Es decir, puede incluir explícitamente algún tipo de marca de tiempo en lo que ha guardado, y luego usarlo más tarde para decidir si la información debe ser eliminada o no.

 160
Author: Pointy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 16:47:00

Sugeriría almacenar la marca de tiempo en el objeto que almacena en el localStorage

var object = {value: "value", timestamp: new Date().getTime()}
localStorage.setItem("key", JSON.stringify(object));

Puede analizar el objeto, obtener la marca de tiempo y comparar con la Fecha actual, y si es necesario, actualizar el valor del objeto.

var object = JSON.parse(localStorage.getItem("key")),
    dateString = object.timestamp,
    now = new Date().getTime().toString();

compareTime(dateString, now); //to implement
 211
Author: sebarmeli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-25 10:07:28

Puede usar lscache. Se encarga de esto automáticamente, incluidas las instancias en las que el tamaño de almacenamiento supera el límite. Si eso sucede, comienza a podar los elementos que están más cerca de su vencimiento especificado.

Del readme:

lscache.set

Stores the value in localStorage. Expires after specified number of minutes.

Arguments
key (string)
value (Object|string)
time (number: optional)

Esta es la única diferencia real entre los métodos de almacenamiento regulares. Obtener, quitar, etc. funciona igual.

Si no necesita tanta funcionalidad, simplemente puede almacenar una marca de tiempo con el valor (a través de JSON) y compruebe si ha caducado.

Cabe destacar que hay una buena razón por la que el almacenamiento local se deja en manos del usuario. Pero, cosas como lscache son útiles cuando necesita almacenar datos extremadamente temporales.

 33
Author: huyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 08:18:08

Brynner Ferreira, ha traído un buen punto: almacenar una clave de hermano donde reside la información de caducidad. De esta manera, si tiene una gran cantidad de claves, o si sus valores son objetos Json grandes, no necesita analizarlos para acceder a la marca de tiempo.

Aquí sigue una versión mejorada:

 /*  removeStorage: removes a key from localStorage and its sibling expiracy key
    params:
        key <string>     : localStorage key to remove
    returns:
        <boolean> : telling if operation succeeded
 */
 function removeStorage(name) {
    try {
        localStorage.removeItem(name);
        localStorage.removeItem(name + '_expiresIn');
    } catch(e) {
        console.log('removeStorage: Error removing key ['+ key + '] from localStorage: ' + JSON.stringify(e) );
        return false;
    }
    return true;
}
/*  getStorage: retrieves a key from localStorage previously set with setStorage().
    params:
        key <string> : localStorage key
    returns:
        <string> : value of localStorage key
        null : in case of expired key or failure
 */
function getStorage(key) {

    var now = Date.now();  //epoch time, lets deal only with integer
    // set expiration for storage
    var expiresIn = localStorage.getItem(key+'_expiresIn');
    if (expiresIn===undefined || expiresIn===null) { expiresIn = 0; }

    if (expiresIn < now) {// Expired
        removeStorage(key);
        return null;
    } else {
        try {
            var value = localStorage.getItem(key);
            return value;
        } catch(e) {
            console.log('getStorage: Error reading key ['+ key + '] from localStorage: ' + JSON.stringify(e) );
            return null;
        }
    }
}
/*  setStorage: writes a key into localStorage setting a expire time
    params:
        key <string>     : localStorage key
        value <string>   : localStorage value
        expires <number> : number of seconds from now to expire the key
    returns:
        <boolean> : telling if operation succeeded
 */
function setStorage(key, value, expires) {

    if (expires===undefined || expires===null) {
        expires = (24*60*60);  // default: seconds for 1 day
    } else {
        expires = Math.abs(expires); //make sure it's positive
    }

    var now = Date.now();  //millisecs since epoch time, lets deal only with integer
    var schedule = now + expires*1000; 
    try {
        localStorage.setItem(key, value);
        localStorage.setItem(key + '_expiresIn', schedule);
    } catch(e) {
        console.log('setStorage: Error setting key ['+ key + '] in localStorage: ' + JSON.stringify(e) );
        return false;
    }
    return true;
}
 25
Author: Fernando Fabreti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 19:53:12

Mientras que el almacenamiento local no proporciona un mecanismo de caducidad, las cookies sí. El simple emparejamiento de una clave de almacenamiento local con una cookie proporciona una manera fácil de garantizar que el almacenamiento local se pueda actualizar con los mismos parámetros de caducidad que una cookie.

Ejemplo en jQuery:

if (!$.cookie('your_key') || !localStorage.getItem('your_key')) {
    //get your_data from server, then...
    localStorage.setItem('your_key', 'your_data' );
    $.cookie('your_key', 1);
} else {
    var your_data = localStorage.getItem('your_key');
}
// do stuff with your_data

Este ejemplo establece una cookie con el parámetro predeterminado para que caduque cuando se cierra el navegador. Por lo tanto, cuando el navegador se cierra y se vuelve a abrir, el almacén de datos local para your_data se actualiza por un servidor llamada.

Tenga en cuenta que esto no es exactamente lo mismo que eliminar el almacén de datos local, sino que está actualizando el almacén de datos local cada vez que caduca la cookie. Sin embargo, si su objetivo principal es poder almacenar más de 4K del lado del cliente (la limitación para el tamaño de la cookie), este emparejamiento de la cookie y el almacenamiento local le ayudará a lograr un tamaño de almacenamiento más grande utilizando los mismos parámetros de caducidad que una cookie.

 20
Author: Robert Peake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-22 17:52:55

El ciclo de vida es controlado por la aplicación/usuario.

Del estándar :

Los agentes de usuario deben caducar los datos de las áreas de almacenamiento locales solo por razones de seguridad o cuando así lo solicite el usuario. Los agentes de usuario siempre deben evitar eliminar datos mientras se esté ejecutando un script que pueda acceder a esos datos.

 13
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-24 15:39:44

Aquí muy recomendable usar sessionStorage

  • es lo mismo que localStorage pero destruir cuando se destruye la sesión / cierre del navegador
  • sessionStorage también es útil para reducir el tráfico de red contra las cookies

Para el valor establecido use

sessionStorage.setItem("key","my value");

Para obtener valor use

var value = sessionStorage.getItem("key");

Haga clic aquí para ver api

Todas las formas para set son

  sessionStorage.key = "my val";
  sessionStorage["key"] = "my val";
  sessionStorage.setItem("key","my value");

Todos las formas de get son

  var value = sessionStorage.key;
  var value = sessionStorage["key"];
  var value = sessionStorage.getItem("key");
 11
Author: Dharmendrasinh Chudasama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-06 10:49:49

Del borrador del W3C:

Los agentes de usuario deben caducar los datos de las áreas de almacenamiento locales solo por razones de seguridad o cuando así lo solicite el usuario. Los agentes de usuario siempre deben evitar eliminar datos mientras se esté ejecutando un script que pueda acceder a esos datos.

Usted querrá hacer sus actualizaciones en su horario usando setItem(clave, valor); que agregará o actualizará la clave dada con los nuevos datos.

 9
Author: FatherStorm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-11 22:09:47
// Functions
function removeHtmlStorage(name) {
    localStorage.removeItem(name);
    localStorage.removeItem(name+'_time');
}

function setHtmlStorage(name, value, expires) {

    if (expires==undefined || expires=='null') { var expires = 3600; } // default: 1h

    var date = new Date();
    var schedule = Math.round((date.setSeconds(date.getSeconds()+expires))/1000);

    localStorage.setItem(name, value);
    localStorage.setItem(name+'_time', schedule);
}

function statusHtmlStorage(name) {

    var date = new Date();
    var current = Math.round(+date/1000);

    // Get Schedule
    var stored_time = localStorage.getItem(name+'_time');
    if (stored_time==undefined || stored_time=='null') { var stored_time = 0; }

    // Expired
    if (stored_time < current) {

        // Remove
        removeHtmlStorage(name);

        return 0;

    } else {

        return 1;
    }
}

// Status
var cache_status = statusHtmlStorage('cache_name');

// Has Data
if (cache_status == 1) {

    // Get Cache
    var data = localStorage.getItem('cache_name');
    alert(data);

// Expired or Empty Cache
} else {

    // Get Data
    var data = 'Pay in cash :)';
    alert(data);

    // Set Cache (30 seconds)
    if (cache) { setHtmlStorage('cache_name', data, 30); }

}
 9
Author: Brynner Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-19 18:23:51

Si alguien usa el plugin jStorage de jQuery, se puede agregar caducidad con la función Settl si el plugin jStorage

$.jStorage.set('myLocalVar', "some value");
$.jStorage.setTTL("myLocalVar", 24*60*60*1000); // 24 Hr.
 3
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-16 06:58:52

Solución utilizando angular y localforage:

angular.module('app').service('cacheService', function() {

  return {
    set: function(key, value, expireTimeInSeconds) {
      return localforage.setItem(key, {
        data: value,
        timestamp: new Date().getTime(),
        expireTimeInMilliseconds: expireTimeInSeconds * 1000
      })
    },
    get: function(key) {
      return localforage.getItem(key).then(function(item) {
        if(!item || new Date().getTime() > (item.timestamp + item.expireTimeInMilliseconds)) {
          return null
        } else {
          return item.data
        }
      })
    }
  }

})
 1
Author: Tomas Romero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-17 17:46:01

El enfoque de@sebarmeli es el mejor en mi opinión, pero si solo desea que los datos persistan durante la vida de una sesión, sessionStorage es probablemente una mejor opción:

Este es un objeto global (sessionStorage) que mantiene un área de almacenamiento está disponible durante la duración de la sesión de página. Una sesión de página dura el tiempo que el navegador está abierto y sobrevive sobre la página recarga y restaura. Abrir una página en una nueva pestaña o ventana causará una nueva sesión iniciar.

MDN: sessionStorage

 1
Author: Kevin Leary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-08 13:07:03

Si alguien sigue buscando una solución rápida y no quiere dependencias como jquery, etc. Escribí una mini lib que agrega caducidad al almacenamiento local / de sesión / personalizado, puede encontrarla con la fuente aquí:

Https://github.com/RonenNess/ExpiredStorage

 1
Author: Ronen Ness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-02 20:34:37

Para el beneficio de los buscadores:

Al igual que Fernando, no quería agregar una carga de json cuando los valores almacenados eran simples. Solo necesitaba rastrear alguna interacción de la interfaz de usuario y mantener los datos relevantes (por ejemplo, cómo un usuario usó un sitio de comercio electrónico antes de salir).

Esto no cumplirá con los criterios de todos, pero con suerte será un arranque rápido de copiar+pegar para alguien y guardar la adición de otra lib.

NOTA: Esto no sería bueno si necesita recuperar los elementos individualmente.

// Addition
if(window.localStorage){
    localStorage.setItem('myapp-' + new Date().getTime(), 'my value');
}

// Removal of all expired items
if(window.localStorage){

    // two mins - (1000 * 60 * 20) would be 20 mins
    var expiryTime = new Date().getTime() - (1000 * 60 * 2);

    var deleteRows = [];
    for(var i=0; i < localStorage.length; i++){
        var key = localStorage.key(i);
        var partsArray = key.split('-');
        // The last value will be a timestamp
        var lastRow = partsArray[partsArray.length - 1];

        if(lastRow && parseInt(lastRow) < expiryTime){
            deleteRows.push(key);
        }
    }
    // delete old data
    for(var j=0; j < deleteRows.length; j++){
        localStorage.removeItem(deleteRows[j]);
    }
}
 0
Author: HockeyJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 17:48:05