Как получить уведомление о завершении сеанса? - PullRequest
4 голосов
/ 12 сентября 2009

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

Ответы [ 4 ]

7 голосов
/ 12 сентября 2009

Посмотрите на метод 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 будет со временем уведомлять, потому что время сеанса истечет.

3 голосов
/ 12 сентября 2009

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

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

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

2 голосов
/ 12 сентября 2009

Сеть не имеет состояния, поэтому вы не будете знать, закрыл ли пользователь окно браузера. Вы можете использовать событие '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?";

}
0 голосов
/ 27 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...