HTML5'te, localStorage nesnesi sayfa / etki alanı başına izole mi?


172

HTML5 localStorage nesnesi sayfa / alan adı başına izole mi? LocalStorage anahtarlarını nasıl isimlendireceğimi merak ediyorum. Ayrı bir ön eke ihtiyacım var mı? Yoksa ne istersem onları adlandırabilir miyim?


Kullanıcı komutları ile olası çarpışmalardan kaçınmak için her zaman bir önek kullanırdım - bu da localStorage'ı da kullanabilir.
Benjol

IMO Sayfalar değil, çarpışmalardan kaçınması gereken kullanıcı komut dosyalarıdır. Kullanıcı komut dosyamda komut dosyasından sonra bir önek kullanıyorum.
Camilo Martin

Yanıtlar:


195

Bu, alan adı ve bağlantı noktası ( aynı başlangıç ​​politikasıyla aynı ayırma kuralları ), sayfa başına yapmak için location, veya başka bir yaklaşıma dayalı bir anahtar kullanmanız gerekir .

Sen yok gerek sen olsa gerekiyorsa bir önek kullanın tane. Ayrıca, evet, istediğinizi adlandırabilirsiniz.


77
Her protocol://host:portkombinasyon için benzersizdir .
thasmo

1
www.mysite.it:8012/App1 ve www.mysite.it:8012/App2 yerel depolama alanı paylaştı mı?
DarioN1

3
@ DarioN1 Evet, www.mysite.it:8012/App1 ve www.mysite.it:8012/App2 yerel depolamayı paylaştı. (Uyarı: Bunlara EG http ve https gibi farklı protokollerden erişirseniz, bunlar paylaşılmaz. Aynı protokol, alt alan adı, alan adı ve bağlantı noktası içinde paylaşılırlar - paylaşılır. )
William

31

Mağazalar, "orijin" in Aynı Orijin Politikası (şema [ vs. vs.), bağlantı noktası ve ana bilgisayar kombinasyonu) ile aynı olduğu her bir orijin için geçerlidir . Gönderen spec :httphttps

Her bir üst düzey gözatma bağlamında, her kaynak için bir tane olmak üzere benzersiz bir oturum depolama alanı kümesi bulunur.

Böylece, depolama http://a.example.comve depolama için http://b.example.comayrı ayrı (ve her ikisi de ayrıdır http://example.com), çünkü bunların hepsi farklı ana makinelerdir. Benzer şekilde http://example.com:80ve http://example.com:8080ve https://example.comhepsi farklı kökenlidir.

Web deposunda yerleşik olarak bir kaynağın diğerinin deposuna erişmesine izin veren bir mekanizma yoktur.

'S geldiğini hatırlatırız kökeni , URL'yi değil, bu yüzden http://example.com/page1ve http://example.com/page2depolama erişimi hem http://example.com.


3
Bu çok yazılmıştır, bu yanıtı en çok sevilen, okunması kolay ve tam olarak açıklandığı için, sadece geliştirmeye başlayacak olanlar için bile.
baHI

1
+1, "Web depolama alanında yerleşik bir kaynağın diğerinin deposuna erişmesine izin veren bir mekanizma yok" ifadesini kullandığı için.
Fabien Quatravaux

7

Evet, her alanın / alt alanın farklı bir localStorage'ı vardır ve anahtarları istediğiniz gibi çağırabilirsiniz (önek gerekli değildir).

Anahtar almak için aşağıdaki yöntem anahtarını (index) kullanabilirsiniz.

localStorage.key(0);

Daha önce birden fazla localStorage'a sahip olabileceğiniz globalStorage adlı bir nesne vardı , ancak teknik özelliklerden kaldırıldı


7

Diğerlerinin de belirttiği gibi, localStorage protokol, ana bilgisayar ve bağlantı noktası başına benzersizdir. Önbelleğe alınmış anahtarlarla depolama alanınızı kontrol etmenin kullanışlı bir yolunu istiyorsanız, localDataStorage'ı öneririm .

Sadece anahtarları ön ekleyerek segmentli paylaşılan depolamayı aynı alan içinde zorunlu kılmakla kalmaz, aynı zamanda javascript veri türlerini (Dizi, Boolean, Tarih, Kayan Nokta, Tamsayı, Dize ve Nesne) şeffaf olarak saklar, hafif veri gizleme sağlar, dizeleri otomatik olarak sıkıştırır ve anahtar (isim) ile sorguyu ve (anahtar) değeri ile sorguyu kolaylaştırır.

[YASAL UYARI] Ben yardımcı programın yazarı benim [/ YASAL UYARI]

Örnekler:

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

Gördüğünüz gibi, ilkel değerlere saygı duyulur ve depolamanızı kontrol etmek için birkaç örnek oluşturabilirsiniz.


0

Nick'in önerdiği gibi bu alanda herhangi bir yerde kullanılabilir, alternatif olarak sessionStorage tarayıcı penceresinin kendisinden farklı olduğu için biraz farklı çalışır. Diğer bir deyişle, aynı etki alanındaki diğer sekmeler veya pencereler, depolama nesnesinin aynı kopyasına erişemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.