Изолирован ли объект HTML5 localStorage для каждой страницы / домена? Мне интересно, как бы я назвал ключи localStorage. Нужен ли мне отдельный префикс? Или я могу назвать их как хочу?
В HTML5 изолирован ли объект localStorage для каждой страницы / домена?
Ответы (5)
Для каждого домена и порта (те же правила разделения, что и в той же политике происхождения), чтобы сделать его постраничным, вам нужно будет использовать ключ, основанный на location
, или какой-либо другой подход.
Вам не нужен префикс, но используйте его, если он вам нужен. Кроме того, да, вы можете называть их как хотите.
protocol://host:port
комбинации.
- person thasmo; 04.02.2016
Магазины являются по происхождению, где "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
.
Как отмечали другие, 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
Как видите, примитивные значения соблюдаются, и вы можете создать несколько экземпляров для управления хранилищем.
Да, у каждого домена / поддомена свой localStorage, и вы можете вызывать ключи как хотите (префикс не требуется).
Чтобы получить ключ, вы можете использовать метод key (index), например
localStorage.key(0);
Раньше существовал объект под названием globalStorage, где можно было иметь несколько localStorages, но он устарел из спецификаций.
Он доступен где угодно в этом домене, как предложил Ник, в качестве альтернативы есть sessionStorage, который работает немного иначе, поскольку он отличается от самого окна браузера. То есть другие вкладки или окна в том же домене не имеют доступа к той же копии объекта хранения.