Trong HTML5, đối tượng localStorage có bị cô lập trên mỗi trang / miền không?


172

Đối tượng HTML5 localStorage có bị cô lập trên mỗi trang / miền không? Tôi tự hỏi vì làm thế nào tôi sẽ đặt tên cho khóa LocalStorage. Tôi có cần một tiền tố riêng? Hoặc tôi có thể đặt tên cho họ bất cứ điều gì tôi muốn?


Tôi luôn luôn sử dụng tiền tố, chỉ để tránh xung đột tiềm ẩn với tập lệnh người dùng - cũng có thể sử dụng localStorage.
Stewol

IMO Đó là tập lệnh người dùng nên tránh va chạm, không phải các trang. Trong tập lệnh người dùng của tôi, tôi đang sử dụng một tiền tố được đặt tên theo tập lệnh.
Camilo Martin

Câu trả lời:


195

Đó là trên mỗi tên miền và cổng (cùng một quy tắc tách biệt với cùng một chính sách nguồn gốc ), để làm cho nó trên mỗi trang bạn phải sử dụng một khóa dựa trên location, hoặc một số cách tiếp cận khác.

Bạn không cần tiền tố, hãy sử dụng một tiền tố nếu bạn cần. Ngoài ra, có, bạn có thể đặt tên cho họ bất cứ điều gì bạn muốn.


77
Đó là duy nhất cho mỗi protocol://host:portkết hợp.
thasmo

1
www.mysite.it:8012/App1 và www.mysite.it:8012/App2 có chia sẻ lưu trữ cục bộ không?
DarioN1

3
@ DarioN1 Có, www.mysite.it:8012/App1 và www.mysite.it:8012/App2 đã chia sẻ bộ nhớ cục bộ. (Hãy cẩn thận: Nếu bạn truy cập chúng từ các giao thức khác nhau, EG http so với https, chúng không được chia sẻ. Trong cùng một giao thức, tên miền phụ, tên miền và cổng - chúng được chia sẻ. Đây là cách đơn giản hóa khái niệm 'Xuất xứ'. )
William

31

Các cửa hàng theo mỗi nguồn gốc , trong đó "nguồn gốc" giống với Chính sách nguồn gốc tương tự (sự kết hợp của lược đồ [ httpso với https, v.v.], cổng và máy chủ). Từ thông số kỹ thuật :

Mỗi bối cảnh duyệt cấp cao nhất có một tập hợp các vùng lưu trữ phiên duy nhất, một vùng cho mỗi nguồn gốc.

Do đó, bộ lưu trữ cho http://a.example.comvà bộ lưu trữ http://b.example.comlà riêng biệt (và cả hai đều tách biệt http://example.com) vì đó là tất cả các máy chủ khác nhau. Tương tự như vậy, http://example.com:80http://example.com:8080https://example.comđược tất cả các nguồn gốc khác nhau.

Không có cơ chế được tích hợp vào bộ lưu trữ web cho phép một nguồn gốc truy cập vào bộ lưu trữ của người khác.

Lưu ý rằng đó là nguồn gốc , không phải URL, http://example.com/page1http://example.com/page2cả hai đều có quyền truy cập vào bộ lưu trữ cho http://example.com.


3
Điều này đã được viết rất nhiều, thích câu trả lời này nhất vì nó dễ đọc và được giải thích đầy đủ, ngay cả đối với những người mới bắt đầu phát triển.
baHI

1
+1 để đề cập rằng "Không có cơ chế nào được tích hợp trong bộ lưu trữ web cho phép một nguồn gốc truy cập vào bộ lưu trữ của người khác."
Fabien Quatravaux

7

Vâng, mỗi tên miền / tên miền phụ có một localStorage khác nhau và bạn có thể gọi các khóa bất cứ điều gì bạn muốn (không bắt buộc phải có tiền tố).

Để lấy khóa, bạn có thể sử dụng khóa phương thức (chỉ mục), chẳng hạn như

localStorage.key(0);

Có một đối tượng được gọi là globalStorage trước khi bạn có thể có nhiều LocalStorage, nhưng nó không được chấp nhận từ thông số kỹ thuật


7

Như những người khác đã chỉ ra, localStorage là duy nhất cho mỗi giao thức, máy chủ và cổng. Nếu bạn muốn một cách thuận tiện để kiểm soát bộ nhớ của mình bằng các khóa có tiền tố, tôi đề nghị localDataStorage .

Nó không chỉ giúp thực thi lưu trữ chia sẻ được phân đoạn trong cùng một miền bằng các khóa tiền tố, mà còn lưu trữ trong suốt các loại dữ liệu javascript (Array, Boolean, Date, Float, Integer, String và Object), cung cấp mã hóa dữ liệu nhẹ, tự động nén chuỗi và tạo điều kiện truy vấn theo khóa (tên) cũng như truy vấn theo giá trị (khóa).

[TUYÊN BỐ TỪ CHỐI] Tôi là tác giả của tiện ích [/ DISCLAIMER]

Ví dụ:

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

Như bạn có thể thấy, các giá trị nguyên thủy được tôn trọng và bạn có thể tạo một số trường hợp để kiểm soát bộ nhớ của mình.


0

Nó có sẵn ở bất cứ nơi nào trên miền đó như Nick đề xuất, vì một giải pháp thay thế là sessionStorage hoạt động hơi khác ở chỗ nó khác với chính cửa sổ trình duyệt. Điều đó có nghĩa là các tab hoặc cửa sổ khác trên cùng một tên miền không có quyền truy cập vào cùng một bản sao của đối tượng lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.