Ist in HTML5 das localStorage-Objekt pro Seite / Domäne isoliert?

172

Ist das HTML5 localStorage-Objekt pro Seite / Domäne isoliert? Ich frage mich, wie ich localStorage-Schlüssel benennen würde. Benötige ich ein separates Präfix? Oder kann ich sie benennen, was ich will?

Nathan Moos
quelle
Ich würde immer ein Präfix verwenden, um mögliche Kollisionen mit Benutzerskripten zu vermeiden - die auch localStorage verwenden könnten.
Benjol
IMO Es sind die Benutzerskripte, die Kollisionen vermeiden sollten, nicht die Seiten. In meinem Benutzerskript verwende ich ein Präfix, das nach dem Skript benannt ist.
Camilo Martin

Antworten:

195

Es ist pro Domain und Port (die gleichen Segregationsregeln wie die gleiche Ursprungsrichtlinie ), um es pro Seite zu machen, müssten Sie einen Schlüssel verwenden, der auf dem locationoder einem anderen Ansatz basiert .

Sie müssen nicht brauchen ein Präfix, verwenden Sie ein , wenn Sie es brauchen though. Ja, Sie können sie auch benennen, was Sie wollen.

Nick Craver
quelle
77
Es ist einzigartig pro protocol://host:portKombination.
Thasmo
1
www.mysite.it:8012/App1 und www.mysite.it:8012/App2 hat lokaler Speicher gemeinsam genutzt?
DarioN1
3
@ DarioN1 Ja, www.mysite.it:8012/App1 und www.mysite.it:8012/App2 haben lokalen Speicher gemeinsam genutzt. (Vorsichtsmaßnahme: Wenn Sie über verschiedene Protokolle (EG http vs https) auf sie zugreifen, werden diese nicht gemeinsam genutzt. Innerhalb desselben Protokolls, derselben Subdomain, derselben Domäne und desselben Ports werden sie gemeinsam genutzt. Dies ist eine Vereinfachung des Konzepts von 'Origin'. )
William
31

Die Speicher befinden sich pro Ursprung , wobei "Ursprung" derselbe ist wie für die Richtlinie für denselben Ursprung (eine Kombination aus Schema [ httpvs. httpsusw.], Port und Host). Aus der Spezifikation :

Jeder Browserkontext der obersten Ebene verfügt über einen eindeutigen Satz von Sitzungsspeicherbereichen, einen für jeden Ursprung.

Daher sind der Speicher für http://a.example.comund der Speicher für http://b.example.comgetrennt (und beide sind getrennt von http://example.com), da dies alles unterschiedliche Hosts sind. Ebenso http://example.com:80und http://example.com:8080und https://example.comsind alle unterschiedliche Ursprünge.

In den Webspeicher ist kein Mechanismus integriert, mit dem ein Ursprung auf den Speicher eines anderen zugreifen kann.

Beachten Sie, dass es sich um den Ursprung und nicht um die URL handelt http://example.com/page1und http://example.com/page2beide Zugriff auf den Speicher für haben http://example.com.

TJ Crowder
quelle
3
Dies wurde sehr gut geschrieben, mochte diese Antwort am meisten, da sie leicht zu lesen und vollständig erklärt ist, selbst für diejenigen, die gerade erst mit der Entwicklung beginnen würden.
BaHI
1
+1 für die Erwähnung, dass "im Webspeicher kein Mechanismus eingebaut ist, der es einem Ursprung ermöglicht, auf den Speicher eines anderen zuzugreifen."
Fabien Quatravaux
7

Ja, jede Domain / Subdomain hat einen anderen localStorage und Sie können die Schlüssel beliebig aufrufen (Präfix ist nicht erforderlich).

Um einen Schlüssel zu erhalten, können Sie den Methodenschlüssel (Index) wie z

localStorage.key(0);

Es gab zuvor ein Objekt namens globalStorage, in dem Sie mehrere localStorages haben konnten, das jedoch aus den Spezifikationen nicht mehr stammt

sebarmeli
quelle
7

Wie andere bereits betont haben, ist localStorage pro Protokoll, Host und Port eindeutig. Wenn Sie Ihren Speicher auf praktische Weise mit Präfixschlüsseln steuern möchten, empfehle ich localDataStorage .

Es hilft nicht nur dabei, segmentierten gemeinsam genutzten Speicher innerhalb derselben Domäne durch Präfixieren von Schlüsseln zu erzwingen, sondern speichert auch transparent Javascript-Datentypen (Array, Boolescher Wert, Datum, Float, Ganzzahl, Zeichenfolge und Objekt), bietet eine einfache Datenverschleierung, komprimiert automatisch Zeichenfolgen und Erleichtert die Abfrage nach Schlüssel (Name) sowie die Abfrage nach (Schlüssel) Wert.

[HAFTUNGSAUSSCHLUSS] Ich bin der Autor des Dienstprogramms [/ HAFTUNGSAUSSCHLUSS]

Beispiele:

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

Wie Sie sehen, werden primitive Werte berücksichtigt, und Sie können mehrere Instanzen erstellen, um Ihren Speicher zu steuern.

Mac
quelle
0

Es ist überall in dieser Domain verfügbar, wie Nick vorgeschlagen hat. Alternativ funktioniert sessionStorage etwas anders, da es sich vom Browserfenster selbst unterscheidet. Das heißt, andere Registerkarten oder Fenster in derselben Domäne haben keinen Zugriff auf dieselbe Kopie des Speicherobjekts.

Matt
quelle