В HTML5 изолирован ли объект localStorage для каждой страницы / домена?

Изолирован ли объект HTML5 localStorage для каждой страницы / домена? Мне интересно, как бы я назвал ключи localStorage. Нужен ли мне отдельный префикс? Или я могу назвать их как хочу?


person Nathan Moos    schedule 17.11.2010    source источник
comment
Я всегда использовал префикс, чтобы избежать потенциальных конфликтов с пользовательскими скриптами, которые тоже могут использовать localStorage.   -  person Benjol    schedule 01.04.2011
comment
ИМО. Избегать столкновений должны пользовательские скрипты, а не страницы. В моем пользовательском сценарии я использую префикс, названный в честь сценария.   -  person Camilo Martin    schedule 18.02.2012


Ответы (5)


Для каждого домена и порта (те же правила разделения, что и в той же политике происхождения), чтобы сделать его постраничным, вам нужно будет использовать ключ, основанный на location, или какой-либо другой подход.

Вам не нужен префикс, но используйте его, если он вам нужен. Кроме того, да, вы можете называть их как хотите.

person Nick Craver    schedule 17.11.2010
comment
Он уникален для protocol://host:port комбинации. - person thasmo; 04.02.2016
comment
www.mysite.it:8012/App1 и www.mysite.it:8012/App2 имеет ли локальное хранилище общего доступа? - person DarioN1; 29.06.2018
comment
@ DarioN1 Да, www.mysite.it:8012/App1 и www.mysite.it:8012/App2 имеют общее локальное хранилище. (Предостережение: если вы обращаетесь к ним из разных протоколов, например http и https, они не используются совместно. В рамках одного и того же протокола, субдомена, домена и порта - они являются общими. Это упрощение концепции «Источника». ) - person William; 12.07.2018
comment
file: /// протокол хранит переменные отдельно для каждого каталога. - person sntrcode; 04.04.2021

Магазины являются по происхождению, где "origin" такое же, как и для того же происхождения Политика (комбинация схемы [http vs. https и т. Д.], Порта и хоста). Из спецификации:

Каждый контекст просмотра верхнего уровня имеет уникальный набор областей хранения сеанса, по одной для каждого источника.

Таким образом, хранилище для http://a.example.com и хранилище для http://b.example.com являются отдельными (и они оба отделены от http://example.com), поскольку все это разные хосты. Точно так же http://example.com:80, http://example.com:8080 и https://example.com имеют разное происхождение.

В веб-хранилище нет встроенного механизма, который позволял бы одному источнику получать доступ к хранилищу другого.

Обратите внимание, что это origin, а не URL-адрес, поэтому http://example.com/page1 и http://example.com/page2 оба имеют доступ к хранилищу для http://example.com.

person T.J. Crowder    schedule 25.01.2017
comment
Это было хорошо написано, этот ответ понравился больше всего, так как его легко читать и полностью объяснять даже для тех, кто только начинает разработку. - person baHI; 23.10.2019
comment
+1 за упоминание о том, что в веб-хранилище нет встроенного механизма, позволяющего одному источнику получать доступ к хранилищу другого. - person Fabien Quatravaux; 26.11.2019
comment
очень понравилось, как вы разграничили URL-адрес и происхождение, спасибо - person shankar upadhyay; 09.07.2021

Как отмечали другие, localStorage уникален для каждого протокола, хоста и порта. Если вам нужен удобный способ управления хранилищем с помощью префиксных ключей, я предлагаю localDataStorage.

Он не только помогает обеспечить сегментированное общее хранилище в одном домене с помощью префиксов ключей, он также прозрачно хранит типы данных javascript (массив, логическое значение, дата, число с плавающей запятой, целое число, строка и объект), обеспечивает легкую обфускацию данных, автоматически сжимает строки и облегчает запрос по ключу (имени), а также запрос по значению (ключу).

[DISCLAIMER] Я являюсь автором утилиты [/ DISCLAIMER]

Примеры:

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

Как видите, примитивные значения соблюдаются, и вы можете создать несколько экземпляров для управления хранилищем.

person Mac    schedule 17.07.2017

Да, у каждого домена / поддомена свой localStorage, и вы можете вызывать ключи как хотите (префикс не требуется).

Чтобы получить ключ, вы можете использовать метод key (index), например

localStorage.key(0);

Раньше существовал объект под названием globalStorage, где можно было иметь несколько localStorages, но он устарел из спецификаций.

person sebarmeli    schedule 22.11.2010

Он доступен где угодно в этом домене, как предложил Ник, в качестве альтернативы есть sessionStorage, который работает немного иначе, поскольку он отличается от самого окна браузера. То есть другие вкладки или окна в том же домене не имеют доступа к той же копии объекта хранения.

person Matt    schedule 14.10.2011