Когда элементы в хранилище HTML5 истекает?
https://stackoverflow.com/questions/2326943
Full question
- JavaScript - html5 - local-storage |
- |
Проверял
Решение
изменить - очевидно, собственное приложение может активно удалять материал, если он решит, что слишком стар. То есть, вы явно можете включить какое-то метку времени в том, что вы спаслись, а затем использовать его позже, чтобы решить, следует ли промывать информацию.
Другие советы
<Р> Я хотел бы предложить для хранения метки времени в объекта хранятся в LocalStorage
var object = {value: "value", timestamp: new Date().getTime()}
localStorage.setItem("key", JSON.stringify(object));
<Р> Вы можете разобрать объект, получить метку времени и сравнить с текущей датой, а также при необходимости изменить значение объекта.
var object = JSON.parse(localStorage.getItem("key")),
dateString = object.timestamp,
now = new Date().getTime().toString();
compareTime(dateString, now); //to implement
<Р> Вы можете использовать lscache . Он обрабатывает это автоматически, в том числе тех случаев, когда размер хранилища превышает предел. Если это произойдет, то начинает подрезать элементы, которые ближе всего к их указанному выдохе.
<Р> Изreadme
:
lscache.set
Stores the value in localStorage. Expires after specified number of minutes.
Arguments
key (string)
value (Object|string)
time (number: optional)
<Р> Это единственное реальное различие между обычными методами хранения. Получите, удалить и т.д. работать так же. Р>
<Р> Если вам не нужно, что много функциональности, вы можете просто хранить метку времени со значением (через JSON) и проверить его истечения.
<Р> Стоит отметить, что есть хорошая причина, почему локальное хранилище осталось до пользователя. Но такие вещи, как lscache приходят очень удобно, когда вам нужно хранить очень временные данные. Р>
<Р> Бриннер Ferreira, принес хороший момент: хранение ключа родственного где информация истечения проживает. Таким образом, <сильного> если у вас есть большое количество ключей, или если значения большие Json объекты , вам не нужно, чтобы разобрать их, чтобы получить доступ к метке времени.
<Р> отсюда следует усовершенствованную версию: /* 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;
}
<Р> В то время как локальное хранилище не обеспечивает механизм истечения, печенье делать. Просто сопряжение локального ключа хранения с куки обеспечивает простой способ гарантировать, что локальное хранилище может быть обновлено с теми же параметрами, экспираций как печенье.
<Р> Пример в 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
<Р> Этот пример устанавливает куки с параметром по умолчанию истекает при закрытии браузера. Таким образом, когда браузер закрыт и вновь открыт, локальное хранилище данных для your_data получает обновляется на стороне сервера вызова.
<Р> Обратите внимание, что это не совсем так же, как <ет> удаление локальное хранилище данных, то вместо того, чтобы обновить локальное хранилище данных всякий раз, когда печенье истекает. Однако, если ваша главная цель состоит в том, чтобы иметь возможность хранить более 4K стороны клиента (ограничение в отношении размера печенья), это спаривание печенья и локального хранилища поможет вам выполнить больший размер памяти, используя те же параметры истечения срока действия, как печенье . р>
<Р> Здесь настоятельно рекомендуется использовать <сильный> sessionStorage
- это так же, как <сильный> LocalStorage , но разрушают сессии уничтожены / браузер близко
- sessionStorage также полезен для уменьшения сетевого трафика от печенья
<Р> для заданного значения р>
sessionStorage.setItem("key","my value");
<Р> для использования значения приобретает
var value = sessionStorage.getItem("key");
<Р> для просмотра нажмите здесь апи
<Р> все пути для множества являются
sessionStorage.key = "my val";
sessionStorage["key"] = "my val";
sessionStorage.setItem("key","my value");
<Р> все способы для ГЭТ являются
var value = sessionStorage.key;
var value = sessionStorage["key"];
var value = sessionStorage.getItem("key");
<Р> Жизненный цикл управляется с помощью приложения / пользователя. Р> <Р> Из стандартным :
Агенты пользователей должны истечь данные из локальных зон хранения только по соображениям безопасности или по требованию, чтобы сделать это пользователем. Агенты пользователей должны всегда избегать удаления данных в то время как сценарий, который может получить доступ к этим данным работают.
<Р> Из проекта W3C:
<Р> Вы хотите сделать ваши обновления на вашем графике, используя SetItem (ключ, значение); что будет либо добавить или обновить данный ключ с новыми данными.Агенты пользователей должны истечь данные из локальных зон хранения только по соображениям безопасности или по требованию, чтобы сделать это пользователем. Агенты пользователей должны всегда избегать удаления данных в то время как сценарий, который может получить доступ к этим данным работают.
// 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); }
}
<Р> Если кто-то использует jStorage Плагин JQuery тем он может быть добавить экспирации с функцией setTTL если jStorage плагин
$.jStorage.set('myLocalVar', "some value");
$.jStorage.setTTL("myLocalVar", 24*60*60*1000); // 24 Hr.
<Р> Если кто-то все еще ищет для быстрого решения и не хотят зависимостей, как JQuery и т.д. я написал мини-LIB, добавляющие действия для локального / сеанса / пользовательского хранилища, вы можете найти его с источником здесь:
<Р> https://github.com/RonenNess/ExpiredStorage<Р> Обход с помощью угловых и 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
}
})
}
}
})
<Р> @ sebarmeli Подход является лучшим на мой взгляд, но если вы хотите только данные сохраняются в течение жизни сессии, то sessionStorage
, вероятно, лучший вариант:
<Р> Это глобальный объект (sessionStorage), который поддерживает область хранения который доступен для продолжительности страницы сессии. Сеанс страницы длится до тех пор, пока открыт браузер и выживает более страницы перезагружается и восстановление. Открытие страницы в новой вкладке или окне будет вызывать новый сеанс будет инициирован. р><Р> MDN: sessionStorage р>
<Р> В пользу искателей:
<Р> Как и Фернандо, я не хочу, чтобы добавить нагрузку JSON, когда значения хранятся были простыми. Мне просто нужно, чтобы отслеживать некоторое взаимодействие пользовательского интерфейса и сохранять данные релевантными (например, как пользователь использовал сайт электронной коммерции перед проверкой). <Р> Это не будет соответствовать критериям Всякие, но мы надеемся, будет быстро копировать + вставить стартер для кого-то и сохранить, добавив другую библиотеку. <Р>. ПРИМЕЧАНИЕ: Это не было бы хорошо, если вам нужно получить элементы по отдельности// 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]);
}
}
<Р> Вы можете попробовать это.
var hours = 24; // Reset when storage is more than 24hours
var now = new Date().getTime();
var setupTime = localStorage.getItem('setupTime');
if (setupTime == null) {
localStorage.setItem('setupTime', now)
} else {
if(now-setupTime > hours*60*60*1000) {
localStorage.clear()
localStorage.setItem('setupTime', now);
}
}