ОТКЛЮЧИТЬ АДБЛОК

ADBlock блокирует некоторый контент на сайте

ADBlock errore

Когда элементы в хранилище HTML5 истекает?

StackOverflow https://stackoverflow.com/questions/2326943

вопрос

<Р> Как долго хранятся данные в LocalStorage (в рамках DOM Storage в HTML5) доступны? Могу ли я установить время истечения срока действия для данных, которые я ставлю в LocalStorage?

Решение

<Р> Это невозможно определить срок действия. Это полностью зависит от пользователя.

<Р> https://developer.mozilla.org/en- США / документы / Web / API / Window / LocalStorage

<Р> Конечно, возможно, что-то ваше приложение сохраняет на клиенте не может быть там позже. Пользователь может явно избавиться от локального хранилища, или браузер может работать в пространстве соображений. Это хорошо программировать защищаясь. Как правило, однако, все останется «навсегда» на основании некоторого практического определения этого слова.

изменить - очевидно, собственное приложение может активно удалять материал, если он решит, что слишком стар. То есть, вы явно можете включить какое-то метку времени в том, что вы спаслись, а затем использовать его позже, чтобы решить, следует ли промывать информацию.

ДРУГИЕ СОВЕТЫ

<Р> Я хотел бы предложить для хранения метки времени в объекта хранятся в 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);
    }
}

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow