Mam pewne wartości w mojej witrynie, które chcę wyczyścić po zamknięciu przeglądarki. Zdecydowałem sessionStorage
się przechowywać te wartości. Gdy zakładka jest zamknięta, są one rzeczywiście czyszczone i zachowywane, jeśli użytkownik naciśnie klawisz f5; Jeśli jednak użytkownik otworzy łącze w innej karcie, te wartości są niedostępne.
Jak mogę udostępniać sessionStorage
wartości na wszystkich kartach przeglądarki w mojej aplikacji?
Przykład użycia: umieść wartość w jakimś miejscu, utrzymuj tę wartość dostępną na wszystkich kartach przeglądarki i wyczyść ją, jeśli wszystkie karty są zamknięte.
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, defaultValue)
}
javascript
cross-browser
session-storage
Vladimir Gordienko
źródło
źródło
Odpowiedzi:
Możesz użyć localStorage i jego „storage” eventListener do przenoszenia danych sessionStorage z jednej karty na drugą.
Ten kod musiałby istnieć na WSZYSTKICH kartach. Powinien być wykonywany przed innymi skryptami.
Testowałem to na chrome, ff, safari czyli 11 czyli 10 ie9
Ta metoda „powinna działać w IE8”, ale nie mogłem jej przetestować, ponieważ moja IE ulegała awarii za każdym razem, gdy otwierałem kartę ... dowolna karta ... na dowolnej stronie internetowej. (dobry IE) PS: oczywiście musisz dołączyć podkładkę JSON, jeśli chcesz również obsługiwać IE8. :)
Podziękowania dla tego pełnego artykułu: http://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/
źródło
BroadcastChannel
to, że jest teraz dobrym narzędziem do tego. developers.google.com/web/updates/2016/09/broadcastchannelUżywanie
sessionStorage
do tego nie jest możliwe.Z MDN Docs
Oznacza to, że nie możesz udostępniać plików między kartami, w tym celu powinieneś użyć
localStorage
źródło
path='/'
wymusić jego wyczyszczenie po zamknięciu okna przeglądarki. Ale jeśli chodzi o karty, nie mam teraz pojęcia.localStorage
dane, ma miejsce, ponieważ ktoś przechodzi do innej domeny, na tej samej karcie. Wydaje mi się, że to niepoprawnie usunielocalStorage
dane - karta nie została zamknięta, a jeśli dana osoba wróci, będzie chciała danych ponownie, prawda. Zresztą to ciekawe podejście, o tym nie pomyślałem: -)Możesz po prostu użyć
localStorage
i zapamiętać datę, w której został utworzonysession cookie
. KiedylocalStorage
„sesja” jest starsza niż wartość pliku cookie, możesz wyczyścićlocalStorage
Wadą tego jest to, że ktoś może nadal odczytywać dane po zamknięciu przeglądarki, więc nie jest to dobre rozwiązanie, jeśli Twoje dane są prywatne i poufne.
Możesz przechowywać swoje dane
localStorage
przez kilka sekund i dodać nasłuchiwaniestorage
zdarzenia. W ten sposób dowiesz się, kiedy którakolwiek z zakładek zapisała coś w folderzelocalStorage
i możesz skopiować jego zawartość do folderusessionStorage
, a następnie po prostu wyczyścićlocalStorage
źródło
W rzeczywistości patrząc na inne obszary, jeśli otworzysz za pomocą _blank, zachowuje on pamięć sesji, o ile otwierasz kartę, gdy rodzic jest otwarty:
W tym linku jest dobry jsfiddle do przetestowania. sessionStorage w nowym oknie nie jest puste, gdy podążasz za linkiem z target = "_ blank"
źródło
Moim rozwiązaniem, aby nie mieć sessionStorage przenoszonego przez karty, było utworzenie localProfile i odrzucenie tej zmiennej. Jeśli ta zmienna jest ustawiona, ale moje zmienne sessionStorage nie są gotowe i ponownie je zainicjuj. Gdy użytkownik wyloguje się, okno zamknie się, zniszcz tę zmienną localStorage
źródło
Oto rozwiązanie zapobiegające ścinaniu sesji między kartami przeglądarki w przypadku aplikacji Java. To zadziała dla IE (JSP / Servlet)
1) pierwsza strona JS
2) wspólny JS dla wszystkich stron
3) web.xml - mapowanie serwletów
4) kod serwletu
źródło