¿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?
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.
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
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.
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;
}
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.
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.
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.
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");
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");
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.
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); }
}
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.
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
}
})
}
}
})
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.
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í:
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]);
}
}
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