2009-04-30 18 views
22

Używam ciasteczek sesyjnych z moją witryną. Ku mojemu zaskoczeniu zauważyłem, że jeśli ustawię sesyjny plik cookie (nie jest to trwały plik cookie), zamknę kartę, a następnie ponownie połączę się z witryną, pliki cookie sesji są nadal dostępne. Nie tego właściwie bym się spodziewał. Spodziewałbym się, że sesyjne pliki cookie zostaną usunięte.Dlaczego nie zamyka się karty Usuń plik cookie sesji?

Jeśli zamkniesz przeglądarkę, plik cookie sesji zostanie usunięty, dlaczego więc nie zamknąć tej zakładki, aby uzyskać ten sam wynik?

Dlatego używam PHP5 i jQuery. Czy jest coś, co mogę zrobić, aby po zamknięciu karty rozwiązać ten problem z sesją? Niestety zdarzenie onbeforeunload w tagu BODY nie jest tu użyteczne, ponieważ po kliknięciu z dala od strony uruchamia się to zdarzenie, a nie tylko zamknięcie karty.

Odpowiedz

14

Plik cookie sesji jest wykonywany dla całego procesu, a nie dla każdego okna. Więc nawet jeśli wybierzesz Nowe okno, nadal będziesz mieć ten sam identyfikator sesji. To zachowanie ma sens. Nie chcesz, aby użytkownik ponownie logował się za każdym razem, gdy otwierał nowe okno podczas przeglądania witryny.

Nie zdaję sobie z tego sprawy z prawdziwego zdarzenia.

+0

Paul, zobacz mój komentarz do Sandera poniżej, zaczyna się, "Problem tutaj ..." –

+1

W takich okolicznościach zamknięcie karty nie jest głównym problemem. Kontroluje wygaśnięcie sesji w bardziej aktywny sposób. Będziesz chciał zaimplementować pewien rodzaj limitu czasu aktywności na kliencie w JS, który automatycznie wyloguje się po braku aktywności użytkownika. Ten typ zachowania znajdziesz na większości witryn bankowych. –

+0

Paul, masz rację. Spałem w tej sprawie i to jest plan działania, który zamierzam podjąć. Teraz, aby wprowadzić kolejne pytanie stackoverflow na najbardziej optymalny sposób realizacji tego. –

8

Jest to zgodne z projektem i próbuje zmienić to bardzo zły pomysł. Co się stanie, jeśli użytkownik otworzy link w nowej karcie i zamknie go? Czy sesja w oryginalnej karcie powinna zostać zniszczona? Oczywiście nie! To pokazuje, dlaczego nie powinieneś o tym myśleć.

Sesja kończy się po zamknięciu ostatniego okna przeglądarki. Jeśli chcesz czegoś innego, musisz:

  1. nie chcę sesji;
  2. trzeba stworzyć własną infrastrukturę "minisesji";
  3. są prawdopodobnie w świecie ran i błędów.
+3

Problemem jest tutaj środowisko publiczne, takie jak biblioteka i czyjś profil online z informacjami o tożsamości w środku. Muszę wymyślić rozwiązanie. –

+0

Mimo to wydaje się, że masz kilka dobrych odpowiedzi na to pytanie i wybierz jedną z nich jako poprawną odpowiedź. Być może chcesz również rozpocząć nowe pytanie? – bignose

3

Można również napisać skrypt, który wykrywa, gdy klapka jest zamknięta i usunąć ciasteczka w javascript

+3

Jak możesz to zrobić? – thesecretmaster

+0

spróbować dodać detektor do beforeunload zdarzenie – Hammer

+0

Zrobiłem coś takiego $ (okno) .scroll (function() { \t \t if (sessionStorage.getItem ('advertOnce!') == 'true') { \t \t \t \t sessionStorage.setItem ('advertOnce', 'prawdziwy') \t \t \t \t initPopup(); \t \t \t \t \t} \t}); –

2

sesji internetowej składowania mogą być stosowane zamiast ciasteczek jeśli trzeba polegać na zamknięciu kart.

1

Znalazłem pracę.

Pracuję w ASP.NETC#. Mam Master Page dla wszystkich stron witryny, z wyjątkiem strony Login. W przypadku Page Load event Sever Page Load event uzyskuję Url strony odsyłającej i sprawdzam, czy zawiera on katalog główny witryny, jeśli nie, przekierowuję na stronę Login, a ponieważ nie ma ona tego Master Page, wyświetla się.

Działa to, gdy próbuję dostać się do strony z innej strony lub wpisuję adres Url w polu adresu przeglądarki. Jeśli więc zamkniesz kartę i spróbujesz ponownie wejść z innej karty lub ponownie otworzyć kartę, nawet jeśli plik cookie nie został zabity, nie możesz ponownie wejść do witryny bez przechodzenia przez nią przez Login. Działa to nawet wtedy, gdy nie zamknąłeś karty i nie korzystasz z nawigacji między różnymi witrynami na tej samej karcie.

Jest to kod

if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root")) 
     { 
      Response.Redirect("~/Account/Login.aspx"); 
     } 

Podczas nawigacji z poziomu strony nie ma żadnego problemu, nawet jeśli otworzyć link do innej strony w miejscu na innej karcie to otwiera.

Jeśli chcesz dodatkowo upewnić się, że możesz zabić sesję i plik cookie uwierzytelniania w tej klauzuli if przed ponownym przekierowaniem na stronę Login.

Nie będzie działać, gdy użytkownik przejdzie do innej witryny na tej samej karcie i naciśnie przycisk przeglądarki back to, ponieważ działa on w pamięci podręcznej i nie wysyła automatycznie żądania na serwer.

To nie zabija sesji ani pliku cookie służącego do uwierzytelniania podczas zamykania karty, ale może zapobiec ponownemu wprowadzeniu witryny bez logowania po zamknięciu karty.

Powiązane problemy