web-dev-qa-db-de.com

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

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

147
Nathan Moos

Es handelt sich um eine Domain (die gleichen Trennungsregeln wie die gleiche Ursprungsrichtlinie ). Um es pro Seite zu machen, müssten Sie einen Schlüssel verwenden, der auf dem location oder einem anderen Ansatz basiert .

Sie brauchen kein Präfix , verwenden Sie jedoch eines, wenn Sie es benötigen. Ja, Sie können sie auch benennen, was Sie wollen.

172
Nick Craver

Die Speicher sind pro Ursprung , wobei Ursprung dasselbe ist wie für die Same Origin Policy (eine Kombination aus Schema [http vs. https usw.], Port und Host). Von die Spezifikation :

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

So ist der Speicher für http://a.example.com und der Speicher für http://b.example.com sind getrennt (und sie sind beide getrennt von http://stackoverflow.com) wie das sind alle verschiedene Hosts. Ebenso http://example.com:80 und http://example.com:8080 und https://example.com sind alle unterschiedlicher Herkunft.

In den Webspeicher ist kein Mechanismus integriert, der es einem Origin ermöglicht, auf den Speicher eines anderen zuzugreifen.

Beachten Sie, dass es sich um Origin handelt, nicht um URL, also http://example.com/page1 und http://example.com/page2 beide haben Zugriff auf den Speicher für http://example.com.

14
T.J. Crowder

Ja, jede Domain/Subdomain hat ein anderes localStorage und Sie können die Schlüssel nach Belieben aufrufen (Präfix ist nicht erforderlich).

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

localStorage.key(0);

Es gab ein Objekt mit dem Namen globalStorage, vor dem Sie mehrere localStorages haben konnten, aber es wurde aus den Spezifikationen verworfen

7
sebarmeli

Wie bereits erwähnt, ist localStorage pro Protokoll, Host und Port eindeutig. Wenn Sie eine praktische Möglichkeit zur Steuerung Ihres Speichers mit vorangestellten Schlüsseln suchen, empfehle ich localDataStorage .

Durch das Voranstellen von Schlüsseln wird nicht nur die Erzwingung von segmentiertem gemeinsamem Speicher in derselben Domäne unterstützt, sondern es werden auch Javascript-Datentypen (Array, Boolescher Wert, Datum, Gleitkommazahl, Ganzzahl, Zeichenfolge und Objekt) transparent gespeichert 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 Grundwerte berücksichtigt, und Sie können mehrere Instanzen erstellen, um Ihren Speicher zu steuern.

5
Mac

Ich würde immer ein Präfix verwenden, um mögliche Kollisionen mit Benutzerskripten zu vermeiden - was auch localStorage verwenden könnte.

5
Benjol

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

0
Matt