En HTML5, l'objet localStorage est-il isolé par page / domaine?

172

L'objet HTML5 localStorage est-il isolé par page / domaine? Je me demande comment je nommerais les clés localStorage. Ai-je besoin d'un préfixe distinct? Ou puis-je les nommer comme je veux?

Nathan Moos
la source
J'utiliserais toujours un préfixe, juste pour éviter les collisions potentielles avec les scripts utilisateur - qui pourraient également utiliser localStorage.
Benjol
IMO Ce sont les scripts utilisateurs qui devraient éviter les collisions, pas les pages. Dans mon script utilisateur, j'utilise un préfixe nommé d'après le script.
Camilo Martin

Réponses:

195

C'est par domaine et par port (les mêmes règles de ségrégation que la même politique d'origine ), pour le rendre par page, vous devez utiliser une clé basée sur la location, ou une autre approche.

Vous n'avez pas besoin d' un préfixe, utilisez-en un si vous en avez besoin. En outre, oui, vous pouvez les nommer comme vous le souhaitez.

Nick Craver
la source
77
C'est unique par protocol://host:portcombinaison.
thasmo
1
www.monsite.it:8012/App1 et www.monsite.it:8012/App2 a-t-il un stockage local partagé?
DarioN1
3
@ DarioN1 Oui, www.monsite.it:8012/App1 et www.monsite.it:8012/App2 ont un stockage local partagé. (Attention: si vous y accédez à partir de différents protocoles, EG http vs https, ceux-ci ne sont pas partagés. Au sein du même protocole, sous-domaine, domaine et port - ils sont partagés. Ceci est une simplification du concept d '«origine». )
William
31

Les magasins sont par origine , où «origine» est la même que pour la même politique d'origine (une combinaison de schéma [ httpvs. https, etc.], de port et d'hôte). De la spécification :

Chaque contexte de navigation de niveau supérieur possède un ensemble unique de zones de stockage de session, une pour chaque origine.

Ainsi, le stockage pour http://a.example.comet le stockage pour http://b.example.comsont séparés (et ils sont tous deux séparés de http://example.com) car ce sont tous des hôtes différents. De même, http://example.com:80et http://example.com:8080et https://example.comsont tous des origines différentes.

Il n'y a pas de mécanisme intégré au stockage Web permettant à une origine d'accéder au stockage d'une autre.

Notez que c'est l' origine , pas l'URL, donc http://example.com/page1et les http://example.com/page2deux ont accès au stockage pour http://example.com.

TJ Crowder
la source
3
Cela a été très écrit, j'ai le plus aimé cette réponse car elle est facile à lire et pleinement expliquée, même pour ceux qui ne feraient que commencer le développement.
baHI
1
+1 pour avoir mentionné que "Il n'y a pas de mécanisme intégré au stockage Web permettant à une origine d'accéder au stockage d'une autre."
Fabien Quatravaux
7

Oui, chaque domaine / sous-domaine a un localStorage différent et vous pouvez appeler les clés comme vous le souhaitez (le préfixe n'est pas requis).

Pour obtenir une clé, vous pouvez utiliser la clé de méthode (index) telle que

localStorage.key(0);

Il y avait un objet appelé globalStorage avant où vous pouviez avoir plusieurs localStorages, mais il est obsolète par rapport aux spécifications

Sebarmeli
la source
7

Comme d'autres l'ont souligné, localStorage est unique par protocole, hôte et port. Si vous voulez un moyen pratique de contrôler votre stockage avec des clés préfixées, je suggère localDataStorage .

Non seulement il aide à renforcer le stockage partagé segmenté dans le même domaine en préfixant les clés, mais il stocke également de manière transparente les types de données javascript (tableau, booléen, date, flottant, entier, chaîne et objet), fournit une obfuscation légère des données, compresse automatiquement les chaînes et facilite la requête par clé (nom) ainsi que la requête par valeur (clé).

[DISCLAIMER] Je suis l'auteur de l'utilitaire [/ DISCLAIMER]

Exemples:

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

Comme vous pouvez le voir, les valeurs primitives sont respectées et vous pouvez créer plusieurs instances pour contrôler votre stockage.

Mac
la source
0

Il est disponible n'importe où sur ce domaine comme Nick l'a suggéré, comme alternative, sessionStorage fonctionne légèrement différemment en ce sens qu'il est distinct de la fenêtre du navigateur elle-même. C'est-à-dire que les autres onglets ou fenêtres du même domaine n'ont pas accès à cette même copie de l'objet de stockage.

Mat
la source