Session storage что это
LocalStorage, sessionStorage
Объекты веб-хранилища localStorage и sessionStorage позволяют хранить пары ключ/значение в браузере.
Что в них важно – данные, которые в них записаны, сохраняются после обновления страницы (в случае sessionStorage ) и даже после перезапуска браузера (при использовании localStorage ). Скоро мы это увидим.
Но ведь у нас уже есть куки. Зачем тогда эти объекты?
Объекты хранилища localStorage и sessionStorage предоставляют одинаковые методы и свойства:
Давайте посмотрим, как это работает.
Демо localStorage
Основные особенности localStorage :
Например, если запустить этот код…
…И закрыть/открыть браузер или открыть ту же страницу в другом окне, то можно получить данные следующим образом:
Нам достаточно находиться на том же источнике (домен/протокол/порт), при этом URL-путь может быть разным.
Объект localStorage доступен всем окнам из одного источника, поэтому, если мы устанавливаем данные в одном окне, изменения становятся видимыми в другом.
Доступ как к обычному объекту
Также можно получать/записывать данные, как в обычный объект:
Это возможно по историческим причинам и, как правило, работает, но обычно не рекомендуется, потому что:
Перебор ключей
Методы, которые мы видим, позволяют читать/писать/удалять данные. А как получить все значения или ключи?
К сожалению, объекты веб-хранилища нельзя перебрать в цикле, они не итерируемы.
Но можно пройти по ним, как по обычным массивам:
Здесь перебираются ключи, но вместе с этим выводятся несколько встроенных полей, которые нам не нужны:
…Поэтому нам нужно либо отфильтровать поля из прототипа проверкой hasOwnProperty :
…Либо просто получить «собственные» ключи с помощью Object.keys, а затем при необходимости вывести их при помощи цикла:
Последнее работает, потому что Object.keys возвращает только ключи, принадлежащие объекту, игнорируя прототип.
Только строки
Обратите внимание, что ключ и значение должны быть строками.
Если мы используем любой другой тип, например число или объект, то он автоматически преобразуется в строку:
Мы можем использовать JSON для хранения объектов:
Также возможно привести к строке весь объект хранилища, например для отладки:
sessionStorage
Свойства и методы такие же, но есть существенные ограничения:
Давайте посмотрим на это в действии.
Запустите этот код…
…И обновите страницу. Вы всё ещё можете получить данные:
Так получилось, потому что sessionStorage привязан не только к источнику, но и к вкладке браузера. Поэтому sessionStorage используется нечасто.
Событие storage
Представьте, что у вас есть два окна с одним и тем же сайтом. Хранилище localStorage разделяется между ними.
Вы можете открыть эту страницу в двух окнах браузера, чтобы проверить приведённый ниже код.
Обратите внимание, что событие также содержит: event.url – url-адрес документа, в котором данные обновились.
Это позволяет разным окнам одного источника обмениваться сообщениями.
Современные браузеры также поддерживают Broadcast channel API специальный API для связи между окнами одного источника, он более полнофункциональный, но менее поддерживаемый. Существуют библиотеки (полифилы), которые эмулируют это API на основе localStorage и делают его доступным везде.
Итого
Объекты веб-хранилища localStorage и sessionStorage позволяют хранить пары ключ/значение в браузере.
Задачи
Автосохранение поля формы
Когда пользователь закроет страницу и потом откроет её заново он должен увидеть последнее введённое значение.
Как использовать localStorage и sessionStorage в JavaScript
Введение
LocalStorage и sessionStorage, часть API веб-хранилища, – это два отличных инструмента для локального хранения пар ключ/значение.
Использование localStorage и sessionStorage для хранения данных является альтернативой использованию cookies и имеет ряд преимуществ:
Он также совместим со всеми современными браузерами, поэтому вы можете использовать его уже сегодня без каких-либо проблем.
Cookies по-прежнему полезны, особенно когда речь идет об аутентификации, но бывают случаи, когда localStorage или sessionStorage могут быть лучшей альтернативой.
Предпосылки
Чтобы успешно освоить этот материал, вам понадобится следующее:
Понимание localStorage и sessionStorage
localStorage и sessionStorage практически идентичны и имеют одинаковый API.
Разница в том, что при использовании sessionStorage данные сохраняются только до закрытия окна или вкладки.
При использовании localStorage данные сохраняются до тех пор, пока пользователь вручную не очистит кэш браузера или пока веб-приложение не очистит данные.
В этом руководстве рассматривается localStorage, но синтаксис sessionStorage такой же.
Создание, чтение и обновление записей
Вы можете создавать записи для localStorage с помощью метода setItem().
Метод setItem() принимает два аргумента, ключ и соответствующее значение:
Чтобы прочитать записи, используйте метод getItem()
Метод getItem() принимает аргумент, который должен быть ключом.
Эта функция вернет соответствующее значение в виде строки:
Этот код присваивает myItem значение ‘Value’, которое является соответствующим параметром для ключа.
Обновление элемента выполняется с помощью метода setItem().
Опять же, необходимы два аргумента. Аргумент key будет существующим ключом, а аргумент value – новым значением:
Теперь значением ключа localStorage будет ‘New Value’ вместо ‘Value’.
Вы можете создавать, читать и обновлять записи в объекте localStorage
Вы также можете удалять отдельные записи и удалять все записи в формате localStorage
Удаление записей
Вы можете удалить элемент с помощью метода removeItem()
Метод removeItem() принимает аргумент, который будет ключом объекта localStorage
Вы также можете очистить все элементы в localStorage.
Это можно сделать с помощью метода clear().
Вот как очистить все, что хранится в localStorage:
Эти методы дают вам возможность быстро удалять и извлекать элементы из localStorage.
Однако у localStorage есть некоторые ограничения.
И localStorage, и sessionStorage могут хранить только строки.
Чтобы обойти эту проблему, вам нужно использовать методы JSON.
Хранение нестроковых значений с помощью JSON
localStorage может хранить только строковые значения.
Если вы хотите хранить объекты или массивы в качестве значений в localStorage, вы можете использовать JSON.stringify() для преобразования их в строки.
При создании или обновлении пар ключ/значение в localStorage используйте JSON.stringify() с объектом или массивом в качестве аргумента:
Хотя myObj является объектом, JSON.stringify(myObj) преобразуется в строку.
Таким образом, myObj теперь является значением localStorage.
Теперь элемент устанавливается равным значению ключа.
В приведенном выше фрагменте кода значение ключа было установлено в строковую версию myObj. Использование JSON.parse превращает myObj обратно в объект. Поэтому элемент устанавливается равным myObj как объект, а не как строка.
Возможность преобразовывать массивы и объекты в строки с помощью JSON.stringify и обратно с помощью JSON.parse очень полезна.
Вам также потребуется знать, как проверить, пуст ли localStorage или нет.
Проверяем пуст или нет
В этом шаге вы проверите наличие элементов в localStorage.
Вы можете использовать if, чтобы узнать, содержит ли localStorage элементы или он пуст.
Для этого используем длину localStorage:
Если localStorage.length больше 0, то внутри объекта localStorage есть элементы
Добавим else для ситуации отсутствия элементов в localStorage:
Вы можете включить код для применения в else if и else.
localStorage и sessionStorage не поддерживают метод forEach localStorage через элементы в localStorage, поэтому используйте цикл for.
Функция key() принимает целое число в качестве аргумента и возвращает соответствующий ключ.
С помощью for передайте i как целое число для key():
Для возврата соответствующего значения ключа используйте getItem:
Создайте console.log для вывода ключа и значения на экран:
key() очень полезна для итерации по localStorage с помощью циклов for.
Проверка совместимости.
Вы можете протестировать поддержку localStorage, проверив наличие окна в объекте с помощью оператора if.
Заключение
Для хранения пар ключ/значение можно использовать localStorage или sessionStorage.
Существуют методы, позволяющие взаимодействовать с элементами внутри localStorage.
В этом руководстве вы создали, удалили и обновили записи в localStorage. Вы также преобразовывали данные из объектов и массивов в строки и наоборот, используя методы JSON.
LocalStorage в JavaScript: подробное руководство
Общие сведения о localStorage и sessionStorage
LocalStorage и sessionStorage – это веб-хранилища, находящиеся в браузере пользователя и предназначенные для хранения данных.
Хранение информации в этих объектах осуществляется в формате «ключ-значение». Ключ и значение – это всегда строки.
Т.е., по сути, каждое хранилище представляет собой вот такой объект:
Если в качестве значения указать не строку, а какой-то другой тип данных, например, объект, то он будет, перед тем как туда записан, автоматически преобразован в строку (т.е. так как будто мы для него явно вызвали метод toString() ).
Таким образом, в localStorage и sessionStorage :
Где можно увидеть эти хранилища?
Например, в Google Chrome для этого необходимо открыть «Инструменты разработчика», перейти на вкладку «Application». Здесь они находятся на левой панели в разделе «Storage». При выборе источника вы увидите какие данные содержатся соответственно в sessionStorage и localStorage.
sessionStorage vs localStorage
SessionStorage хранит данные только во время текущей сессии (для вкладки, пока она открыта). Закрытие вкладки или браузера приводит к очищению этих данных. При этом данные сохраняются при обновлении страницы или отображение в этой вкладке другой страницы из этого же источника.
localStorage vs cookies
Cookie и localStorage используются для хранения информации в браузере.
Но что лучше использовать в том или ином случае? Чтобы в этом вопросе ориентироваться необходимо знать различия между ними:
Безопасность данных
Хранилище localStorage привязана к источнику (домену, протоколу и порту). Данные, находящиеся в некотором источнике, доступны только на страницах этого же источника. К данным другого источника обратиться нельзя.
SessionStorage ограничена вообще одной вкладкой браузера. Это означает, что с помощью JavaScript нельзя получить доступ к данным другой вкладки даже если она имеет тот же источник.
Работа с localStorage и sessionStorage
Для работы с localStorage и sessionStorage нам доступен одинаковый набор свойств и методов:
Событие storage
Данное событие возникает на объекте window :
Создадим пример, который будет следить за изменениями в localStorage и обновлять в соответствии с ними данные на страницах.
Для этого создадим две страницы (например, «page-1.html» и «page-2.html») и поместим в них следующий код:
Примеры использования localStorage
Кроме указанных методов, можно также использовать квадратные скобки:
2. Удалим все элементы из хранилища localStorage:
3. Переберём все ключи, находящиеся в localStorage :
4. Пример, в котором сохраним объект в localStorage:
5. Проверим поддерживает ли браузер веб-хранилища?
6. Попробуем добавить ключ в localStorage, но если в хранилище закончилось место (QUOTA_EXCEEDED_ERR), то выведем в консоль сообщение об этом:
7. Добавим дату срока действия к элементам, которую затем будем использовать для их очистки (удалять те из них дата срока действия которых превышает текущую):
Задачи
2. Сохранить данные формы в хранилище, а затем восстановить их при перезагрузки страницы.
Web Storage API: примеры использования
Доброго времени суток, друзья!
В данной статье мы рассмотрим парочку примеров использования Web Storage API или объекта «Storage».
Что конкретно мы будем делать?
Краткий обзор
Объект «Storage» используется для хранения данных на стороне клиента и в этом смысле выступает альтернативой cookies. Преимущество Storage состоит в размере хранилища (от 5 Мб, зависит от браузера, при превышении лимита выбрасывается ошибка «QUOTA_EXCEEDED_ERR») и отсутствии необходимости обращаться к серверу. Существенный недостаток — безопасность: стоит вредоносному скрипту получить доступ к странице, и пиши пропало. Поэтому крайне не рекомендуется хранить в Storage конфиденциальную информацию.
Справедливости ради стоит отметить, что на сегодняшний день существуют более продвинутые решения для хранения данных на стороне клиента — это IndexedDB, Service Workers + Cache API и др.
О сервис-воркерах можно почитать здесь.
Web Storage API включает в себя localStorage и sessionStorage. Разница между ними состоит во времени хранения данных. В localStorage данные хранятся постоянно до их «явного» удаления (ни перезагрузка страницы, ни ее закрытие не приводят к удалению данных). Время хранения данных в sessionStorage, как следует из названия, ограничено сессией браузера. Поскольку sessionStorage на практике почти не используется, мы будет рассматривать только localStorage.
Что необходимо знать о localStorage?
Данные в хранилище записываются одним из следующих способов:
Получить данные можно так:
Как перебрать ключи хранилища и получить значения?
Как мы отмечали выше, данные в хранилище имеют строковый формат, поэтому с записью объектов возникают некоторые трудности, которые легко решаются с помощью тандема JSON.stringify() — JSON.parse():
Для взаимодействием с localStorage существует специальное событие — storage (onstorage), которое возникает при записи/удалении данных. Оно имеет следующие свойства:
Допускает ли localStorage прототипирование?
Как проверить наличие данных в localStorage?
В браузере localStorage можно найти здесь:
Довольно слов, пора переходить к делу.
Примеры использования
Запоминаем время воспроизведения видео
Результат выглядит так:
Запускаем видео и останавливаем воспроизведение на третьей секунде, например. Время, на котором мы остановились, хранится в localStorage. Чтобы в этом убедиться, перезагружаем или закрываем/открываем страницу. Видим, что текущее время воспроизведения видео остается прежним.
Работаем с формой для входа
Разметка выглядит так:
Обратите внимание, что мы не «валидируем» форму. Это, в частности, позволяет записывать пустые строки в качестве логина и пароля.
Результат выглядит так:
Вводим волшебные слова.
Данные записываются в localStorage, а на страницу выводится приветствие.
Пишем логику списка задач
Разметка выглядит так:
У нас имеется «инпут» для ввода задачи, кнопка для добавления задачи в список, кнопка для очистки списка и хранилища и контейнер для списка.
Результат выглядит так:
Задачи, добавляемые в список, сохраняются в localStorage в виде готовой разметки. При перезагрузке страницы список формируется из данных хранилища (имеет место перемешивание, о котором упоминалось выше).
Удаление задачи из списка посредством нажатия зеленой галочки приводит к удалению соответствующей пары ключ/значение из хранилища.
Реализация чата
Разметка выглядит так:
У нас имеется инпут для ввода сообщения, три кнопки: для отправки сообщения, для сохранения переписки и для очистки чата и хранилища, а также контейнер для сообщений.
Результат выглядит так:
Отправляемое сообщение записывается в localStorage.message. Событие «storage» позволяет организовать обмен сообщениями между вкладками браузера.
При сохранении чата все сообщения записываются в localStorage.messages. При перезагрузке страницы из записанных сообщений формируется переписка.
Схема корзины для товаров
Мы не преследуем цель создать полнофункциональную корзину, поэтому код будет написан «в старом стиле».
Разметка одного товара выглядит так:
У нас имеется контейнер для товара, наименование, изображение и цена товара, а также кнопка для добавления товара в корзину.
Также у нас имеется контейнер для кнопок отображения содержимого корзины и очистки корзины и хранилища и контейнер для корзины.
Результат выглядит так:
Выбранные товары записываются в хранилище в виде одной пары ключ/значение.
При нажатии кнопки «Cart» данные из localStorage выводятся в таблицу, подсчитывается общее количество товаров и их стоимость.
sessionStorage и localStorage
В этой статье познакомимся с веб-хранилищами sessionStorage и localStorage, изучим методы JavaScript для работы, узнаем про их отличия друг от друга, и от файлов cookie, а также рассмотрим примеры использования в Google Tag Manager.
Самая большая проблема при использовании cookie в качестве локального хранилища заключается в том, что:
С появлением HTML5 мы получили доступ к более объемному веб-хранилищу (между 5 и 10 МБайт на каждый домен), которое сохраняет информацию между загрузками страницы и посещениями сайта (даже после выключения и включения компьютера). Кроме того, данные локального хранилища не отправляются на сервер при каждой загрузке страницы, в связи с чем ускоряется работа веб-приложения.
Существуют два основных типа веб-хранилища:
Оба типа являются свойствами глобального объекта браузера (window). К ним можно обращаться как window.sessionStorage (или sessionStorage) и window.localStorage (или localStorage) соответственно. В них можно хранить ТОЛЬКО СТРОКОВЫЕ ДАННЫЕ для ключей и их значений.
Разберем каждый из них подробнее.
sessionStorage (сессионное хранилище, хранилище сессии)
Объект sessionStorage используется гораздо реже, чем localStorage.
localStorage (локальное хранилище)
Каждый домен имеет доступ к своему хранилищу данных localStorage. Например, localStorage, используемый для, https://osipenkov.ru является отдельным от localStorage, используемым для https://coobiq.com. Субдомены (поддомены) и различные протоколы HTTP (HTTP и HTTPS) имеют независимые друг от друга хранилища данных. Например, localStorage https://gtm.osipenkov.ru используется полностью отдельно от https://osipenkov.ru. Точно так же localStorage https://osipenkov.ru используется отдельно от http://osipenkov.ru.
Некоторые браузеры блокируют localStorage в режиме инкогнито. localStorage работает даже с отключенными cookie.
Примечание: не храните в localStorage конфиденциальную информацию и личные данные пользователией, включая имя, фамилию, дату рождения, пароли, номера кредитных карт, номер телефона, e-mail и многое другое.
Что можно хранить и для чего использовать?
Хранение данных в локальном хранилище очень распространено. Классическим примером использования локального хранилища является веб-приложение типа Ежедневник, когда пользователь составляет список дел на день, и по мере выполнения удаляет их из списка. Для выполнения этой задачи не нужен сервер, подойдет localStorage. Кликнув по задаче из списка, которое человек уже сделал, она будет удаляться с локального хранилища и, следовательно, показываться пользователю больше не будет. Локальное хранилище часто используется для сохранения настроек пользователя на сайте (выбор темы оформления, вид отображения информации), чтобы при следующем заходе эти данные уже были применены к его профилю и повторно не вводились.
Посмотреть, что из себя представляют sessionStorage и localStorage, какие данные там хранятся у разных сайтов, можно в консоли разработчика на вкладе Application (для браузера Google Chrome).
Веб-хранилище (вкладка Application)
Либо использовать команды sessionStorage и localStorage на вкладке Console:
Команда sessionStorage или localStorage (вкладка Console)
Карточка пользователя по одному из чатов
sessionStorage vs localStorage vs cookies
Нагляднее всего продемонстрировать отличия между sessionStorage, localStorage и cookies с помощью таблицы:
Отличие cookies от sessionStorage и localStorage
Помимо этого, согласно правилам обработки персональных данных, установленных Генеральным регламентом ЕС о защите персональных данных (или GDPR — General Data Protection Regulation), владелец сайта должен получать разрешение от пользователей на использование файлов cookie. Для локального хранилища этого не требуется.
Как вы уже знаете, сейчас в части браузеров используется технология «умной защиты от слежения», которая предоставляет отчеты о заблокированных трекерах (в том числе и счетчиках веб-аналитики), тем самым препятствуется слежение за пользователями и показ им персонализированной рекламы с помощью файлов cookie. Хоть мы и можем устанавливать срок жизни куки, их время все равно зависит от настроек самих браузеров. Например, система интеллектуального отслеживания (Intelligent Tracking Prevention, ITP 2.2) Apple ограничивает в Safari использование основных файлов cookie (first-party) до 1 дня. В результате файлы cookie, установленные рекламными сервисами, например, Facebook, Google или Яндексом, для измерения трафика сайта и атрибуции рекламы, будут удалены через 24 часа. И если человек нажимает на рекламное объявление в пятницу, а затем решает отложить покупку в выходные, то в понедельник у нас уже не будет cookie, чтобы показать ему рекламу и напомнить о приобретении. Остается только надеется на то, что человек запомнил наш сайт и вернется сам.
Чтобы отслеживать пользователей больше этого времени, можно использовать localStorage. Но и тут разочарование относительно пользователей Safari. В последних обновлениях разработчики добавили ограничение в 7 дней, то есть срок жизни данных в локальном хранилище теперь ограничен. Когда пользователь просматривает сайт через Safari, счетчик становится равен 7 дням. В течение этого времени он должен повторно вернуться на сайт, чтобы мы смогли использовать информацию из локального хранилища. В противном случае данные по истечении этого времени будут удалены из localStorage.
Так или иначе, sessionStorage и localStorage активно используются разработчиками при разработке веб-приложений, а интернет-маркетологами как альтернатива файлам cookie. В блоге Симо Ахавы (Simo Ahava) есть статья, которая посвящена хранению Client ID в localStorage для Google Analytics.
Методы и свойства
Объекты хранилища sessionStorage и localStorage предоставляют одинаковые методы и свойства:
Запись данных в хранилище
Функция setItem(key, value) принимает ключ в качестве первого аргумента и значение в качестве второго аргумента. Как упоминалось ранее, все данные должны быть строками. Примеры установки: