JavaScript: Magazyn sieciowy local storage i session storage

Opublikowano: 07.10.2021 - tagi: JavaScript Zapis Odczyt Dane Cookies

Magazyn sieciowy

HTML 5 udostępnia programiście API do zapisywania i przechowywania danych o nazwie magazyn sieciowy. Mamy dwa rodzaje magazynów: magazyn lokalny: local storage oraz magazyn sesji: session storage.

Oba mechanizmy korzystają z tego samego interfejsu. Oznacza to, że wszystkie metody dostępne w magazynie lokalnym będą dostępne, w magazynie sesji.

Można zapytać, po co powstały i to jeszcze dwa dodatkowe funkcjonalności skoro istnieje coś takiego jak: cookies? To, co różni ciastka od local/session storage to, że dane w tym drugim są przechowywane wyłącznie po stronie klienta (po stronie przeglądarki). Nie można się do nich dostać po stronie serwera tak jak w przypadku ciastek. Ciastka mają także pewne ograniczenia co do ilości przechowywanych, w nich danych. Wprawdzie takie ograniczenie istnieje także po stronie magazynu sieciowego, ale tam możemy umieścić znacznie więcej danych.

Istnieje pewna różnica między magazynem lokalnym a sesji, ale o tym w dalszej części wpisu. Skupmy się teraz na wspólnym interfejsie.

API magazynu sieciowego

Zapis i odczyt działa na zasadzie: klucz --> wartość.

Do magazynu lokalnego odwołujemy się za pomocą obiektu: localStorage. Do magazynu sesji mamy dostęp poprzez obiekt: sessionStorage.

Z tego powodu, że interejs dla obu magazynów jest taki sam, w przykłądach przyjąłem jedną nazwę dla magazynu storage. Wystarczy, że ją podmienisz na localStorage lub sessionStorage, a będzie działać.

Do pracy z danymi przyda nam się takie API:

Zapis danych

Jeśli chcesz zapisać lub nadpisać dane możesz skorzystać z metody: setItem:

storage.setItem('someData', 'My data');

Pierwszy parametr to unikalny klucz, którym będziemy się posługiwać. Jeśli już taki klucz istnieje i go użyjesz do zapisu, to po prostu nadpiszesz poprzednie dane. Drugi argument to dane, które chcemy zapisać.

Istnieje inny sposób na zapis:

storage['someData'] = 'My data';
storage.extraData = '123';

Odczyt danych

Do pobrania zapisanych danych możemy użyć: getItem:

const data = storage.getItem('someData');

lub:

const data = storage['someData'];
const extraData  = storage.extraData;

Usuwanie danych

Jeśli chcemy skasować dane pod konkrentym kluczem korzystam z funkcji: removeItem:

storage.removeItem('someData');

Kasowanie wszystkich danych

Jeśli chcesz skasować wszystko, co zawiera magazyn sieciowy, użyj funkcji: clear:

storage.clear();

Metoda key

Obiekt magazynu sieciowego zawiera właściwość length. Zwraca ona ilość przechowywanych elementów, w magazynie:

storage.length;

Z kolei key przyjmuje jeden parametr: indeks danego elementu. W rezultacie zwraca nazwę klucza. Przykład:

for (let i = 0; i < storage.length; i++) {
  const key = storage.key(i);
  const value = storage[key];
	
  console.log(key, value);
}

Tylko uwaga: nie będziesz mieć gwarancji, że kolejność jest zachowana, w jaki sposób je dodałeś do magazynu-implementacja zależy od przeglądarki.

Jak zapisać/odczytać obiekt?

Do magazynu sieciowego można zapisać tylko łańcuch znaków. Bardziej złożone typy danych musimy przekonwertować do stringa i wtedy możemy dane zapisać:

Zapis obiektu

const myObject = {
  title: 'Some object',
	amount: 7,
	tags: ['tag 1', 'tag 2', 'tag 3']
}
const objectToSave = JSON.stringify(myObject);
storage.setItem('myObject', objectToSave);

Odczyt obiektu

Po wczytaniu zapisanego obiektu musimy dokonać konwersji ciągu znaków w obiekt:

const myObject = JSON.parse(storage.getItem('myObject'));

console.log(myObject.title);

Różnice między local a session storage

Magazyn dzieli się na dwa rodzaje: magazyn lokalny (local storage) oraz magazyn sesji (session storage). Oba mają ten sam interfejs. Ale są różnice między nimi:

Magazyn lokalny

Przede wszystkim dane przechowywane, w tym magazynie są trwałe — w takim sensie, że gdy użytkownik zamknie stronę, a następnie do niej wróci, to dane dalej tam będą. Dane, w takim magazynie przechowywane są, w obrębie domeny. Uwaga: znaczenie ma także protokół! Jeśli zapiszesz dane pod protokłem: http i będziesz próbować wczytać dane pod https mimo takiej samej domeny nie będziesz mieć do nich dostępu.

Dostęp do magazynu lokalnego mamy poprzez globalny obiekt o nazwie: localStorage.

Magazyn sesji

Dane zapisane, w magazynie sesji są trwałe do momentu jej zamknięcia, to jest do zamknięcia zakładki przeglądarki.

Dostęp do magazynu sieci mamy poprzez globalny obiekt: sessionStorage.