Czy w HTML5 obiekt localStorage jest izolowany na stronę / domenę?

172

Czy obiekt localStorage HTML5 jest izolowany na stronę / domenę? Zastanawiam się, jak nazwałbym klucze localStorage. Czy potrzebuję osobnego prefiksu? Czy mogę nazwać je, jak chcę?

Nathan Moos
źródło
Zawsze używałbym prefiksu, aby uniknąć potencjalnych kolizji ze skryptami użytkownika - które również mogą korzystać z localStorage.
Benjol
IMO To skrypty użytkownika powinny unikać kolizji, a nie strony. W moim skrypcie użytkownika używam przedrostka nazwanego po skrypcie.
Camilo Martin

Odpowiedzi:

195

Jest na domenę i port (te same zasady segregacji, co w przypadku tej samej zasady pochodzenia ), aby ustawić ją na stronę, musisz użyć klucza opartego na locationlub innym podejściu.

Nie potrzebujesz prefiksu, ale użyj go, jeśli go potrzebujesz. Możesz też nadać im dowolne nazwy.

Nick Craver
źródło
77
Jest wyjątkowy pod względem protocol://host:portkombinacji.
thasmo
1
www.mysite.it:8012/App1 i www.mysite.it:8012/App2 ma udostępnioną lokalną pamięć masową?
DarioN1
3
@ DarioN1 Tak, www.mysite.it:8012/App1 i www.mysite.it:8012/App2 współdzielą lokalną pamięć. (Uwaga: jeśli uzyskujesz do nich dostęp z różnych protokołów, np. Http vs https, nie są one współdzielone. W ramach tego samego protokołu, subdomena, domena i port - są współdzielone. Jest to uproszczenie pojęcia „pochodzenia”. )
William
31

Sklepy są według pochodzenia , gdzie „pochodzenie” oznacza to samo, co w przypadku tej samej zasady pochodzenia (połączenie schematu [ httpvs. httpsitd.], Portu i hosta). Ze specyfikacji :

Każdy kontekst przeglądania najwyższego poziomu ma unikalny zestaw obszarów przechowywania sesji, po jednym dla każdego źródła.

Tak więc pamięć masowa dla http://a.example.comi pamięć masowa http://b.example.comsą oddzielne (i są od siebie oddzielne http://example.com), ponieważ są to różne hosty. Podobnie, http://example.com:80a http://example.com:8080i https://example.comsą różne pochodzenie.

W pamięci sieciowej nie ma wbudowanego mechanizmu, który umożliwia jednemu źródłu dostęp do pamięci innego.

Należy pamiętać, że jest to początek , a nie URL, tak http://example.com/page1i http://example.com/page2obie mają dostęp do przechowywania http://example.com.

TJ Crowder
źródło
3
To było wspaniale napisane, najbardziej podobała się ta odpowiedź, ponieważ jest łatwa do odczytania i w pełni wyjaśniona, nawet dla tych, którzy dopiero zaczynają pracę.
baHI
1
+1 za wzmiankę, że „Nie ma mechanizmu wbudowanego w magazyn sieciowy, który umożliwia jednemu źródłu dostęp do pamięci innego”.
Fabien Quatravaux
7

Tak, każda domena / subdomena ma inny LocalStorage i możesz wywoływać klucze, jak chcesz (prefiks nie jest wymagany).

Aby uzyskać klucz, możesz użyć klucza metody (indeksu), takiego jak

localStorage.key(0);

Wcześniej istniał obiekt o nazwie globalStorage, w którym można było mieć wiele localStorage, ale został on wycofany ze specyfikacji

sebarmeli
źródło
7

Jak inni zauważyli, localStorage jest unikalna dla każdego protokołu, hosta i portu. Jeśli chcesz wygodnego sposobu kontrolowania pamięci za pomocą kluczy z prefiksami, sugeruję localDataStorage .

Nie tylko pomaga wymusić podzieloną na segmenty pamięć współdzieloną w tej samej domenie poprzez prefiksowanie kluczy, ale także w przejrzysty sposób przechowuje typy danych javascript (Array, Boolean, Date, Float, Integer, String and Object), zapewnia lekkie zaciemnianie danych, automatycznie kompresuje ciągi znaków i ułatwia wyszukiwanie według klucza (nazwy), a także zapytania według wartości (klucza).

[ZRZECZENIE SIĘ] Jestem autorem narzędzia [/ ZRZECZENIE SIĘ]

Przykłady:

// instantiate our first storage object
// internally, all keys will use the specified prefix, i.e. passphrase.life
var localData = localDataStorage( 'passphrase.life' );

localData.set( 'key1', 'Belgian' )
localData.set( 'key2', 1200.0047 )
localData.set( 'key3', true )
localData.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localData.set( 'key5', null )

localData.get( 'key1' )   -->   'Belgian'
localData.get( 'key2' )   -->   1200.0047
localData.get( 'key3' )   -->   true
localData.get( 'key4' )   -->   Object {RSK: Array(5)}
localData.get( 'key5' )   -->   null


// instantiate our second storage object
// internally, all keys will use the specified prefix, i.e. prismcipher.com
var localData2 = localDataStorage( 'prismcipher.com' );

localData2.set( 'key1', 123456789 )  // integer

localData2.get( 'key1' )   -->   123456789

Jak widać, prymitywne wartości są przestrzegane i można utworzyć kilka instancji, aby kontrolować pamięć.

Prochowiec
źródło
0

Jest on dostępny w dowolnym miejscu w tej domenie, jak zasugerował Nick, jako alternatywa jest to, że sessionStorage działa nieco inaczej, ponieważ różni się od samego okna przeglądarki. Oznacza to, że inne karty lub okna w tej samej domenie nie mają dostępu do tej samej kopii obiektu pamięci.

Matt
źródło