Почему закрытие вкладки не удаляет файл cookie сеанса? - PullRequest
23 голосов
/ 30 апреля 2009

Я использую сеансовые куки с моим сайтом. К моему полному удивлению, я заметил, что если я установлю сеансовый cookie (не постоянный cookie), закрою вкладку и затем снова подключусь к сайту, сеансовые cookie все еще там. На самом деле это не то, чего я ожидал. Я ожидал, что сессионные куки будут удалены.

Если вы закрываете браузер, cookie-файл сеанса удаляется, так почему бы не закрыть вкладку, чтобы получить тот же результат?

Поэтому я использую PHP5 и jQuery. Могу ли я что-нибудь сделать, чтобы при закрытии вкладки я мог решить эту проблему? К сожалению, событие onbeforeunload для тега BODY здесь бесполезно, поскольку при щелчке по странице оно запускается, а не просто закрывается вкладка.

Ответы [ 5 ]

16 голосов
/ 30 апреля 2009

Сеансовый файл cookie для каждого процесса, а не для каждого окна. Таким образом, даже если вы выбрали Новое окно, вы все равно получите тот же идентификатор сеанса. Такое поведение имеет смысл. Вы не хотели бы, чтобы пользователь повторно входил в систему при каждом открытии нового окна при просмотре вашего сайта.

Я не знаю, как это можно обойти.

8 голосов
/ 30 апреля 2009

Это по замыслу и пытаться изменить это очень плохая идея. Что если пользователь откроет ссылку в новой вкладке и закроет ее? Должен ли сеанс в исходной вкладке быть уничтожен? Конечно, нет! Это показывает, почему вы не должны даже думать об этом.

Сессия заканчивается, когда закрывается последнее окно браузера. Если вы хотите что-то еще, вы:

  1. не хочу сессий;
  2. необходимо создать собственную инфраструктуру "мини-сессии";
  3. вероятно, для мира больно и ошибок.
3 голосов
/ 06 марта 2011

Вы также можете написать javascript, который определяет, когда вкладка закрыта, и удалять cookie в javascript

2 голосов
/ 30 марта 2017

Сеансовое веб-хранилище можно использовать вместо файлов cookie, если вам нужно зависеть от закрытия вкладки.

1 голос
/ 25 июня 2017

Я нашел работу вокруг.

Я работаю в ASP.NET C#. У меня есть Master Page для всех страниц сайта, кроме страницы Login. В Master Page Sever Page Load event я получаю Url ссылающейся страницы и проверяю, содержит ли она корень сайта, если нет, я перенаправляю на страницу Login и, так как она не имеет Master Page отображается.

Это работает, если я пытаюсь перейти на страницу с другого сайта или если я ввожу Url в адресную строку браузера. Поэтому, если вы закроете вкладку и попытаетесь повторно войти с другой вкладки или снова откроете вкладку, даже если файл cookie не был уничтожен, вы не сможете повторно войти на сайт, не пройдя Login. Это также работает, даже если вы не закрыли вкладку и переходите между разными сайтами на одной вкладке.

Это код

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

При навигации по сайту нет проблем, даже если вы откроете ссылку на другую страницу сайта на другую вкладку, которую он открывает.

Если вы хотите быть дополнительно уверены, что можете удалить файл cookie сеанса и аутентификации в этом предложении if перед перенаправлением на страницу Login.

Это не будет работать, когда пользователь перешел на другой сайт на той же вкладке и нажмет кнопку браузера back to, поскольку он работает в кеше и не отправляет запрос на сервер автоматически.

Таким образом, это не уничтожает файл cookie сеанса или аутентификации при закрытии вкладки, но может помочь предотвратить повторный вход на сайт без входа в систему после закрытия вкладки.

...