Могут ли базы данных HTML5 и localStorage делиться между субдоменами?

Я пытаюсь обмениваться данными через субдомены с помощью Safari. Я хотел бы использовать базу данных HTML5 (в частности localStorage, так как мои данные - не что иное, как пары ключ-значение). Однако, похоже, что данные, хранящиеся в domain.com, недоступны из sub.domain.com (или наоборот). Есть ли способ разделить одну базу данных в этой ситуации?

Ответ 1

Обновление 2016

Эта библиотека из Zendesk работала для меня.

Образец:

хаб

// Config s.t. subdomains can get, but only the root domain can set and del
CrossStorageHub.init([
  {origin: /\.example.com$/,            allow: ['get']},
  {origin: /:\/\/(www\.)?example.com$/, allow: ['get', 'set', 'del']}
]);

Обратите внимание на $ для соответствия конца строки. Регулярное выражение в приведенном выше примере будет соответствовать источнику, например valid.example.com, но не invalid.example.com.malicious.com.

клиент

var storage = new CrossStorageClient('https://store.example.com/hub.html');

storage.onConnect().then(function() {
  return storage.set('newKey', 'foobar');
}).then(function() {
  return storage.get('existingKey', 'newKey');
}).then(function(res) {
  console.log(res.length); // 2
}).catch(function(err) {
  // Handle error
});

Проверьте fooobar.com/questions/92453/...

Ответ 2

Существует простой способ использовать что-либо в нескольких доменах, просто создайте простую страницу, которая будет включена в качестве прокси-сервера iframe, размещенного в домене, к которому вы пытаетесь получить доступ, отправьте PostMessage в этот iframe, а внутри iframe вы будете выполнять манипуляции с базой данных LocalStorage. Вот ссылка на статью, которая делает это с помощью lcoalStorage. А вот демо, которое отправляет сообщение на другую страницу в поддомене, проверяет исходный код, в нем используются iframe и PostMessage.

РЕДАКТИРОВАТЬ: Новая версия библиотеки sysend.js (используется в демонстрационной версии выше) использует BroadcastChannel, если браузер поддерживает его, но все же он требует Iframe. Последняя версия также упрощает использование сообщений Cross-Origin, у вас есть html iframe в репо, который вы можете использовать (или вы можете использовать простой html файл с одним тегом script с библиотекой lib), а в parent вам просто нужно вызвать одну функцию sysend.proxy('https://example.com'); где example.com должен иметь файл proxy.html (вы также можете использовать свое собственное имя файла и другой путь).

Ответ 3

Google Chrome блокирует доступ localStoage от iFrame в другом домене по умолчанию, если только сторонний cookie не включен, и Safari на iPhone... единственное решение, похоже, открывает родительский домен в другом домене, а затем отправляет для ребенка через window.postMessage, но выглядит уродливым и смещенным по телефонам...