Di HTML5, apakah objek localStorage diisolasi per halaman / domain?

172

Apakah objek localStorage HTML5 diisolasi per halaman / domain? Saya bertanya-tanya karena bagaimana saya memberi nama kunci Penyimpanan lokal. Apakah saya memerlukan awalan terpisah? Atau bisakah saya beri nama apa pun yang saya inginkan?

Nathan Moos
sumber
Saya selalu menggunakan awalan, hanya untuk menghindari kemungkinan tabrakan dengan skrip pengguna - yang bisa menggunakan localStorage juga.
Benjol
IMO Itu skrip pengguna yang harus menghindari tabrakan, bukan halaman. Dalam skrip pengguna saya, saya menggunakan awalan yang dinamai skrip.
Camilo Martin

Jawaban:

195

Ini per domain dan port (aturan pemisahan yang sama dengan kebijakan asal yang sama ), untuk membuatnya per halaman Anda harus menggunakan kunci berdasarkan location, atau beberapa pendekatan lain.

Anda tidak perlu awalan, gunakan satu jika Anda membutuhkannya. Juga, ya, Anda dapat memberi nama mereka apa pun yang Anda inginkan.

Nick Craver
sumber
77
Ini unik per protocol://host:portkombinasi.
thasmo
1
www.mysite.it:8012/App1 dan www.mysite.it:8012/App2 memiliki penyimpanan lokal yang dibagikan?
DarioN1
3
@ DarioN1 Ya, www.mysite.it:8012/App1 dan www.mysite.it:8012/App2 telah berbagi penyimpanan lokal. (Peringatan: Jika Anda mengaksesnya dari protokol yang berbeda, misalnya http vs https, itu tidak dibagi. Dalam protokol, subdomain, domain, dan port yang sama - mereka dibagikan. Ini adalah penyederhanaan konsep 'Asal'. )
William
31

Toko-toko adalah per asal , di mana "asal" sama dengan Kebijakan Same Origin (kombinasi skema [ httpvs. https, dll], port, dan host). Dari spec :

Setiap konteks penelusuran tingkat atas memiliki satu set area penyimpanan sesi yang unik, satu untuk setiap sumber.

Jadi, penyimpanan untuk http://a.example.comdan penyimpanan http://b.example.comterpisah (dan keduanya terpisah http://example.com) karena semuanya adalah host yang berbeda. Demikian pula, http://example.com:80dan http://example.com:8080dan https://example.comsemuanya berasal berbeda.

Tidak ada mekanisme yang dibangun dalam penyimpanan web yang memungkinkan satu asal mengakses penyimpanan yang lain.

Perhatikan bahwa itu asalnya , bukan URL, sehingga http://example.com/page1dan http://example.com/page2keduanya memiliki akses ke penyimpanan untuk http://example.com.

TJ Crowder
sumber
3
Ini sangat ditulis, paling suka jawaban ini karena mudah dibaca dan dijelaskan sepenuhnya, bahkan bagi mereka yang baru memulai pengembangan.
baHI
1
+1 untuk menyebutkan bahwa "Tidak ada mekanisme yang dibangun ke dalam penyimpanan web yang memungkinkan satu sumber mengakses penyimpanan yang lain."
Fabien Quatravaux
7

Ya, setiap domain / subdomain memiliki localStorage yang berbeda dan Anda dapat memanggil tombol apa pun yang Anda inginkan (awalan tidak diperlukan).

Untuk mendapatkan kunci, Anda dapat menggunakan kunci metode (indeks) seperti

localStorage.key(0);

Ada objek yang disebut globalStorage sebelum di mana Anda bisa memiliki beberapa localStorage, tapi sudah tidak digunakan lagi dari spesifikasi

sebarmeli
sumber
7

Seperti yang telah ditunjukkan orang lain, localStorage unik untuk setiap protokol, host & port. Jika Anda ingin cara praktis untuk mengontrol penyimpanan Anda dengan kunci awalan, saya sarankan localDataStorage .

Tidak hanya membantu menegakkan penyimpanan bersama yang disegmentasi dalam domain yang sama dengan awalan kunci, itu juga secara transparan menyimpan tipe data javascript (Array, Boolean, Date, Float, Integer, String dan Object), menyediakan kebingungan data ringan, secara otomatis mengompresi string, dan memfasilitasi permintaan dengan kunci (nama) serta permintaan dengan nilai (kunci).

[DISCLAIMER] Saya adalah penulis utilitas [/ DISCLAIMER]

Contoh:

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

Seperti yang Anda lihat, nilai-nilai primitif dihormati, dan Anda dapat membuat beberapa instance untuk mengontrol penyimpanan Anda.

Mac
sumber
0

Ini tersedia di mana saja di domain itu seperti yang disarankan Nick, sebagai alternatif ada sessionStorage bekerja sedikit berbeda karena berbeda dengan jendela browser itu sendiri. Artinya, tab atau jendela lain di domain yang sama tidak memiliki akses ke salinan yang sama dari objek penyimpanan.

Mat
sumber