In HTML5, l'oggetto localStorage è isolato per pagina / dominio?


172

L'oggetto HTML5 localStorage è isolato per pagina / dominio? Mi chiedo come potrei nominare le chiavi localStorage. Ho bisogno di un prefisso separato? O posso nominarli come voglio?


Userei sempre un prefisso, solo per evitare potenziali collisioni con gli script utente, che potrebbero usare anche localStorage.
Benjol,

IMO Sono gli script utente che dovrebbero evitare le collisioni, non le pagine. Nel mio script utente sto usando un prefisso che prende il nome dallo script.
Camilo Martin,

Risposte:


195

È per dominio e porta (le stesse regole di segregazione della stessa politica di origine ), per renderlo per pagina dovresti usare una chiave basata sull'approccio locationo su qualche altro approccio.

Non hai bisogno di un prefisso, usane uno se ne hai bisogno però. Inoltre, sì, puoi nominarli come preferisci.


77
È unico per protocol://host:portcombinazione.
thasmo,

1
www.mysite.it:8012/App1 e www.mysite.it:8012/App2 ha uno spazio di archiviazione locale condiviso?
DarioN1,

3
@ DarioN1 Sì, www.mysite.it:8012/App1 e www.mysite.it:8012/App2 hanno condiviso l'archiviazione locale. (Avvertenza: se vi si accede da protocolli diversi, ad es. Http vs https, questi non sono condivisi. All'interno dello stesso protocollo, sottodominio, dominio e porta - sono condivisi. Questa è una semplificazione del concetto di "Origine". )
William,

31

I negozi sono per origine , dove "origine" è uguale a quello della stessa politica di origine (una combinazione di schema [ httpvs. https, ecc.], Porta e host). Dalle specifiche :

Ogni contesto di navigazione di livello superiore ha un set unico di aree di memorizzazione della sessione, una per ogni origine.

Pertanto, l'archiviazione per http://a.example.come l'archiviazione per http://b.example.comsono separati (e sono entrambi separati da http://example.com) in quanto sono tutti host diversi. Allo stesso modo, http://example.com:80e http://example.com:8080e https://example.comsono tutte origini diverse.

Non esiste alcun meccanismo integrato nella memoria Web che consente a un'origine di accedere alla memoria di un'altra.

Nota che è origine , non URL, quindi http://example.com/page1ed http://example.com/page2entrambi hanno accesso all'archivio per http://example.com.


3
Questo è stato scritto molto, questa risposta è piaciuta di più in quanto è facile da leggere e completamente spiegata, anche per coloro che avrebbero appena iniziato lo sviluppo.
baHI

1
+1 per menzionare che "Non esiste alcun meccanismo incorporato nella memoria Web che consente a un'origine di accedere alla memoria di un'altra".
Fabien Quatravaux,

7

Sì, ogni dominio / sottodominio ha un archivio locale diverso e puoi chiamare le chiavi come vuoi (prefisso non richiesto).

Per ottenere una chiave è possibile utilizzare la chiave del metodo (indice) come

localStorage.key(0);

Prima c'era un oggetto chiamato globalStorage in cui si potevano avere più localStorage, ma è stato deprecato dalle specifiche


7

Come altri hanno sottolineato, localStorage è unico per protocollo, host e porta. Se vuoi un modo pratico per controllare la tua memoria con chiavi con prefisso, ti suggerisco localDataStorage .

Non solo aiuta a imporre l'archiviazione condivisa segmentata all'interno dello stesso dominio mediante il prefisso delle chiavi, ma archivia in modo trasparente i tipi di dati javascript (Array, Boolean, Date, Float, Integer, String e Object), fornisce offuscamento leggero dei dati, comprime automaticamente stringhe e facilita la query per chiave (nome) e la query per valore (chiave).

[DISCLAIMER] Sono l'autore dell'utilità [/ DISCLAIMER]

Esempi:

// 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

Come puoi vedere, i valori primitivi sono rispettati e puoi creare diverse istanze per controllare la tua memoria.


0

È disponibile ovunque su quel dominio come suggerito da Nick, in alternativa c'è sessionStorage funziona in modo leggermente diverso in quanto è distinto dalla finestra del browser stesso. Vale a dire che altre schede o finestre sullo stesso dominio non hanno accesso alla stessa copia dell'oggetto di archiviazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.