Как получить уведомление о завершении сеанса?

StackOverflow https://stackoverflow.com/questions/1413407

  •  06-07-2019
  •  | 
  •  

Вопрос

Мне интересно, могу ли я обработать событие тайм-аута сеанса. Мне нужно вызвать функцию к моей функции непосредственно перед тем, как тайм-аут сеанса или пользователь покинул мою страницу или закрыл окно браузера. Наиболее важной частью здесь является доступ ко всему, что хранится во время сеанса, переменные сеанса.

Это было полезно?

Решение

Посмотрите на метод Session_End () в global.asax. Файл global.asax уже должен быть подключен для вызова этого метода после завершения сеанса. Вы можете просто разместить свой код там, где захотите.

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the session ends
    End Sub

Конечно, вы должны заметить, что сессия полностью на стороне сервера. Это закончится только после X минут бездействия (по умолчанию 20 минут). Это не закончится, как только пользователь закроет окно. ASP.NET не знает, как пользователь закрывает окно или покидает вашу страницу.

И на самом деле, сложно выполнить любое немедленное действие на стороне сервера, когда это происходит. Я имею в виду, что легко вызвать window.onbeforeunload в Javascript и вызвать окно подтверждения, прежде чем пользователь закроет окно. Но когда вы пытаетесь отправить пакет на сервер непосредственно перед тем, как окно действительно закроется, я думаю, вы обнаружите, что сделать все это удобным для пользователя становится сложной задачей. Вы можете написать некоторый Javascript, который отправляет сообщение на сервер, используя AJAX, который уведомляет сервер о том, что пользователь закрывает свой браузер, а затем использовать больше Javascript, чтобы закрыть браузер после того, как это сообщение было отправлено. Но тогда пользователь получит раздражающее сообщение (в большинстве браузеров) о том, что скрипт пытается закрыть окно. Это будет выглядеть очень любопытно для пользователей и может заставить их дважды подумать о возвращении.

Так что, если вы готовы смириться с задержкой, я бы просто полностью избежал всего этого беспорядка в Javascript и использовал бы чисто серверное решение с использованием Session_End (). В конце концов, если пользователь закроет окно или уйдет, ASP.NET со временем уведомит об этом, поскольку время сеанса истечет.

Другие советы

Session_end будет обрабатывать проблему истечения времени ожидания сеанса. Однако это не сработает, когда пользователь закрывает браузер или переходит на другой URL-адрес. Он ожидает истечения времени ожидания сеанса.

Чтобы обнаружить другие условия, вы должны будете использовать javascript на клиенте. Однако эти методы не всегда надежны в зависимости от браузера / версии и т. Д. Также, если компьютер пользователя выключается, отключается от сети или полностью отключается, этот сценарий не запускается.

Вы можете рассмотреть другие альтернативы. Что именно вы пытаетесь достичь с помощью этой функции?

Сеть не имеет состояния, поэтому вы не будете знать, закрыл ли пользователь окно браузера. Вы можете использовать событие 'Session_End' в файле global.asax для тайм-аута сессии. Если вам нужен доступ ко всем сеансам, вы можете сохранить их в коллекции с помощью события 'Session_Start', также в глобальном файле.

Изменить. Если вы хотите перехватить событие закрытия страницы с помощью JavaScript, вот как это делается (обратите внимание, это ненадежно):

window.onbeforeunload = closeIt;

function closeIt(){ 


  return "You have unsaved changes. Are you sure you want to leave this page?";

}

У вас может быть базовая страница, которая наследуется каждой страницей aspx & amp; в событии init вашей базовой страницы просто проверьте переменную сеанса на пустые места. Если это ничего, это означает, что сеанс истек, и вы можете перенаправить пользователя на страницу входа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top