2016-01-28 16 views
11

standardem W3C standard mówi o localStorages:Jak mają oddzielne sessionStorages dla iframe na samego pochodzenia

Different authors sharing one host name, for example users hosting content on geocities.com , all share one local storage object. There is no feature to restrict the access by pathname. Authors on shared hosts are therefore urged to avoid using these features, as it would be trivial for other authors to read the data and overwrite it.

Ale sessionStorages to powiedział, że nie przewiduje odrębnych sessionStorages dla karty i okna nawet z tego samego pochodzenia.

Wygląda jednak na to, że ramka iframes współużytkuje sessionStorage.

Czy istnieje sposób na oddzielne zapisy sesji przy pomocy elementów iframe na tym samym początku.

Edytuj: Edytuj: Ponieważ nie było zamieszania, jeśli karty/okna mają oddzielne Pamięci sesji, tutaj jest przykładowa strona. Zapisz kod w pliku i otwórz go za pomocą dwóch różnych kart. Następnie odśwież jedną kartę 5 razy i odśwież inną kartę 1 raz. Zobaczysz, że liczby różnią się.

<!DOCTYPE html> 
<html> 
<body> 
    <div id="result"></div> 
    <script> 
     sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0) + 1); 
     document.getElementById("result").innerHTML = sessionStorage.getItem("counter"); 
    </script> 
</body> 
</html> 

Edit2: Co próbowałem tak daleko jest użycie atrybutu sandbox iframe. Ale wtedy dostałem błąd w elemencie iframe i nie mogę w ogóle użyć sessionStorage. Musiałem dodać sandbox="allow-same-origin". Ale potem sessionStorage jest taki sam we wszystkich iframes ponownie.

Z góry dziękuję.

+1

Jaki jest cel, oczekiwany wynik utworzenia innego 'sessionStorage' dla' iframes'? – guest271314

+1

Jedyna różnica między 'sessionStorage' i' localStorage' jest wygaśnięciem. Oba są specyficzne dla początku, co oznacza, że ​​strony z tego samego źródła, niezależnie od tego, jak są otwierane, korzystają z tego samego obiektu pamięci masowej. Jeśli chcesz mieć separację, użyj obiektu z kluczami i uszereguj go przed przechowywaniem. – adeneo

+0

@ guest271314 Wyobraź sobie, że masz stronę z pełnym menedżerem okien. Każde okno składa się z elementu iframe z pojedynczym plikiem html z odpowiednimi js. Strony te nie powinny mieć możliwości korzystania ze swoich zapasów. Ale wszyscy są na tym samym hoście. Jest to bardzo bardzo uproszczona wersja naszej konfiguracji. – McK

Odpowiedz

2

@adeneo jest prawidłowa, gdy wskazuje

the storage container is set to the origin domain, and iframes from the same origin share the same object, even if the iFrame opens a new session

Rozwiązaniem nie wydaje się obecnie istnieją

<!DOCTYPE html> 
<html> 
<body> 
    <iframe name="one" src="sessionStorageTest.html"></iframe> 
    <iframe name="two" src="sessionStorageTest1.html"></iframe> 
</body> 
</html> 

sessionStorageTest.html

<!DOCTYPE html> 
<html> 
<body> 
    <div id="result"></div> 
    <script> 
     sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0) + 1); 
     document.getElementById("result").innerHTML = sessionStorage.getItem("counter"); 
    </script> 
</body> 
</html> 

sessionStorageTest1.html

<!DOCTYPE html> 
<html> 
<body> 
    <div id="result"></div> 
    <script> 
     var i = 0; 
      while (++i < 10) { 
      sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0) + 1); 
      document.getElementById("result").innerHTML = sessionStorage.getItem("counter"); 
      } 
    </script> 
</body> 
</html> 

wykazano w plnkr http://plnkr.co/edit/Etel4ToABM6gWOw6qAE5?p=preview

+0

Informacja, że ​​implementacja działa w ten sposób dla iframe została już przez mnie zadeklarowana w pytaniu. Poprawną odpowiedzią byłoby stwierdzenie, że nie istnieje obejście. Czy mógłbyś zaktualizować swoją odpowiedź, aby to odzwierciedlić? Z góry dziękuję. – McK

+1

@McK Zobacz aktualny wpis – guest271314

2

Istnieje obejście jeśli masz SSL. Korzystanie z https: // ... w celu uzyskania dostępu do jednego dokumentu i http: // ... w celu uzyskania dostępu do drugiego spowoduje utworzenie osobnych magazynów dla tego samego pochodzenia.

+0

+1 za kompletność. To bardzo interesujące. Tego nie wiedziałem. Niestety nie jest to możliwe w naszym obecnym środowisku, ponieważ jesteśmy zmuszeni używać TLC we wszystkich naszych witrynach. – McK

Powiązane problemy