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

172

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

Натан Моос
источник
Я бы всегда использовал префикс, просто чтобы избежать потенциальных коллизий с пользовательскими скриптами, которые тоже могут использовать localStorage.
Бенджол
IMO Избегать коллизий должны пользовательские скрипты, а не страницы. В моем пользовательском скрипте я использую префикс, названный в честь скрипта.
Камило Мартин

Ответы:

195

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

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

Ник Крейвер
источник
77
Это уникально для каждой protocol://host:portкомбинации.
thasmo
1
www.mysite.it:8012/App1 и www.mysite.it:8012/App2 имеет общее локальное хранилище?
DarioN1
3
@ DarioN1 Да, www.mysite.it:8012/App1 и www.mysite.it:8012/App2 имеют общее локальное хранилище. (Предостережение: если вы обращаетесь к ним по разным протоколам, например, по протоколу http против https, они не являются общими. В рамках одного и того же протокола, субдомена, домена и порта они являются общими. Это упрощает концепцию «происхождения». )
Уильям
31

Хранилища для каждого источника , где «происхождение» такое же, как и в « Политике одного источника» (комбинация схемы [ httpи httpsт. Д.], Порта и хоста). Из спецификации :

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

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

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

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

TJ Crowder
источник
3
Это было очень написано, этот ответ понравился больше всего, так как его легко прочитать и полностью объяснить, даже для тех, кто только начинает разработку.
baHI
1
+1 за упоминание о том, что «в веб-хранилище нет механизма, позволяющего одному источнику получать доступ к хранилищу другого».
Фабьен Кватраво
7

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

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

localStorage.key(0);

До этого существовал объект с именем globalStorage, в котором вы могли иметь несколько локальных хранилищ, но он не рекомендуется использовать в спецификации.

sebarmeli
источник
7

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

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

[ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ] Я являюсь автором утилиты [/ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ]

Примеры:

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

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

макинтош
источник
0

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

Matt
источник