HTML5では、localStorageオブジェクトはページ/ドメインごとに分離されていますか?


172

HTML5 localStorageオブジェクトはページ/ドメインごとに分離されていますか?localStorageキーに名前を付ける方法に疑問があるのですが。別のプレフィックスが必要ですか?または、好きな名前を付けられますか?


ユーザースクリプトとの潜在的な競合を回避するために、常にプレフィックスを使用します-localStorageも使用できます。
Benjol 2011

IMOページではなく、衝突を回避するのはユーザースクリプトです。ユーザースクリプトでは、スクリプトにちなんで付けられたプレフィックスを使用しています。
Camilo Martin

回答:


195

それはドメインとポートごとにあります(と同じ分離ルール 同じ発信元ポリシー)ごとであり、ページごとにするにはlocation、に基づいたキーを使用する必要があります。

プレフィックスは必要ありません必要に応じて使用してください。また、はい、好きな名前を付けることができます。


77
protocol://host:port組み合わせごとにユニークです。
thasmo 2016

1
www.mysite.it:8012/App1とwww.mysite.it:8012/App2はローカルストレージを共有していますか?
DarioN1

3
@ DarioN1はい、www.mysite.it:8012 / App1とwww.mysite.it:8012/App2はローカルストレージを共有しています。(注意:異なるプロトコル(例:httpとhttps)からアクセスする場合、これらは共有されません。同じプロトコル、サブドメイン、ドメイン、ポート内で共有されます。これは、「Origin」の概念を単純化したものです。 )
ウィリアム

31

ストアはoriginごとにあり、「origin」はSame Origin Policyと同じです(スキーマ(httpvs httpsなど)、ポート、およびホストの組み合わせ)。スペックから:

各トップレベルのブラウジングコンテキストには、各起点に1つずつ、一連​​の一意のセッションストレージ領域があります。

したがって、のストレージhttp://a.example.comとのストレージhttp://b.example.comは別々です(両方ともから別々ですhttp://example.com)。これらはすべて異なるホストであるためです。同様にhttp://example.com:80http://example.com:8080そしてhttps://example.comはすべて異なる起源です。

あるオリジンが別のオリジンのストレージにアクセスできるようにするメカニズムがWebストレージに組み込まれていません。

これはURLではなくオリジンでありhttp://example.com/page1http://example.com/page2両方とものストレージにアクセスできることに注意してくださいhttp://example.com


3
これは非常に書かれていて、開発を始めたばかりの人にとっても、読みやすく、完全に説明されているので、この回答が最も気に入りました。
baHI

1
「1つのオリジンが別のオリジンのストレージにアクセスすることを可能にするメカニズムがWebストレージに組み込まれていません。」
Fabien Quatravaux

7

ええ、各ドメイン/サブドメインには異なるlocalStorageがあり、好きなようにキーを呼び出すことができます(プレフィックスは不要です)。

キーを取得するには、次のようなメソッドkey(index)を使用できます。

localStorage.key(0);

複数のlocalStorageを配置できる場所の前にglobalStorageと呼ばれるオブジェクトがありましたが、仕様から非推奨になりました


7

他の人が指摘したように、localStorageはプロトコル、ホスト、ポートごとに一意です。接頭辞付きのキーでストレージを制御する便利な方法が必要な場合は、localDataStorageをお勧めします

プレフィックスキーによって同じドメイン内のセグメント化された共有ストレージを強制するのに役立つだけでなく、JavaScriptデータ型(配列、ブール、日付、フロート、整数、文字列、オブジェクト)を透過的に保存し、軽量なデータ難読化を提供し、文字列を自動的に圧縮します。キー(名前)によるクエリと(キー)値によるクエリを容易にします。

[免責事項]私はユーティリティの作成者です[/免責事項]

例:

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

ご覧のように、プリミティブ値が尊重され、ストレージを制御するためにいくつかのインスタンスを作成できます。


0

Nickが提案したように、そのドメインの任意の場所で使用できます。代わりに、ブラウザーウィンドウ自体とは異なるという点でsessionStorageの動作が少し異なります。つまり、同じドメインの他のタブまたはウィンドウは、ストレージオブジェクトの同じコピーにアクセスできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.