webentwicklung-frage-antwort-db.com.de

Können HTML5-Datenbanken und localStorage für mehrere Unterdomänen freigegeben werden?

Ich versuche, mit Safari Daten über Subdomains hinweg freizugeben. Ich möchte eine HTML5-Datenbank verwenden (insbesondere localStorage , da meine Daten nur Schlüssel-Wert-Paare sind). Es sieht jedoch so aus, als ob auf Daten, die unter domain.com gespeichert sind, nicht über sub.domain.com zugegriffen werden kann (oder umgekehrt). Gibt es in dieser Situation eine Möglichkeit, eine einzelne Datenbank gemeinsam zu nutzen?

60
Sebastian Celis

Update 2016

Diese Bibliothek von Zendesk hat für mich funktioniert.

Stichprobe:

Hub

// 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']}
]);

Beachten Sie das $ für die Übereinstimmung mit dem Ende der Zeichenfolge. Der reguläre Ausdruck im obigen Beispiel entspricht Ursprüngen wie valid.example.com, aber nicht invalid.example.com.malicious.com.

Client

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
});

Überprüfen Sie https://stackoverflow.com/a/39788742/50646

12
super1ha1

Es gibt eine einfache Möglichkeit, domänenübergreifend alles zu verwenden. Erstellen Sie einfach eine Seite, die als Proxy enthalten ist. Iframe wird auf der Domain gehostet, auf die Sie zugreifen möchten. Senden . PostMessage zu diesem iframe und innerhalb von iframe führen Sie Ihre LocalStorage-Datenbankmanipulation durch. Hier ist ein Link zu Artikel, der dies mit lcoalStorage macht . Und hier ist Demo, die eine Nachricht an eine andere Seite in der Unterdomäne sendet Überprüfen Sie den Quellcode, es werden iframe und PostMessage verwendet.

[~ # ~] edit [~ # ~] : Neu Version der sysend.js-Bibliothek (wird von der obigen Demo verwendet) Verwenden Sie BroadcastChannel, wenn der Browser dies unterstützt , aber es erfordert immer noch Iframe. Neuere Versionen vereinfachen auch die Verwendung von Cross-Origin-Nachrichten. Sie haben HTML-Code des iFrames in repo, den Sie verwenden können (oder Sie können eine einfache HTML-Datei mit einem einzelnen Skript-Tag mit der lib verwenden), und im übergeordneten Element müssen Sie nur eine Funktion aufrufen sysend.proxy('https://example.com'); wobei example.com eine proxy.html - Datei haben muss (Sie können auch Ihren eigenen Dateinamen und einen anderen Pfad verwenden).

9
jcubic

Google Chrome blockiert standardmäßig den localStoage-Zugriff von einem iFrame in einer anderen Domain, es sei denn, Cookies von Drittanbietern sind aktiviert, und Safari auf dem iPhone ... die einzige Lösung scheint darin zu bestehen, die übergeordnete Domain auf einem zu öffnen andere Domain und dann an das Kind über window.postMessage senden, sieht aber auf Handys hässlich und unordentlich aus ...

4
Mad Scientist