2010-11-09 7 views
2

Что было бы лучшим способом определить, умер ли SessionState, чтобы отправить пользователя на страницу «Session Expired»? Я успешно настроил приложение (в Web.config), чтобы сделать это, когда cookie проверки подлинности пропал (для этого есть настройка), но до сих пор я не нашел эффективного способа сделать что-то подобное, когда SessionState ушел. В рассматриваемом приложении содержатся некоторые данные в Session, и он должен представить пользователю страницу «Session Expired - Please login again», если какой-либо из них исчез.Как определить, закончилось ли SessionState?

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

ответ

1

Почему бы не включить проверку сеанса на главной странице? Любая из ваших переменных сеанса вернет значение null, если сессия истекла. Итак, на page_load вы можете проверить любой из них и выполнить соответствующие действия, то есть Response.Redirect. Однако вы говорите, что в файле Web.Config вы можете проверить, нет ли cookie проверки подлинности, так что вы не можете выполнить это действие?

Другим методом было бы использовать HTTP Module, который перехватывал бы каждый запрос и решал, что с ним делать. Это было бы лучше, чем мой первый метод, и это произойдет до обработки любой страницы.

+0

Http-обработчики не предназначены для перехвата запроса ... они предназначены для обработки. Вместо этого вы должны пойти на модуль Http, который может подписаться на большое количество событий из цикла Request, например «Begin Request», и выполнить некоторую логику независимо от обработчика, обрабатывающего запрос. –

3

Да, это сложно. :)

Существует нет реального простого/окончательного способа сделать это.

Один из вариантов - привязать руководство/идентификатор в коллекции Session [] во время Session_Start (global.asax), а затем проверить это значение в Page_Load вашей базовой страницы (например, мастера).

Другой вариант заключается в проверке фактического ASPX печенье:

HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"]; 

Если это нуль, сеанс окончен.

4

Я помню подобный вопрос. На самом деле у вас мало возможностей.

Я имею в виду, что вы не можете перенаправить пользователя на страницу, когда сервер запускает событие SessionEnd, с которым вы можете обращаться в Global.asax.

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

Теперь пришло время, чтобы перенаправить пользователя :)

Надежда, была помощь.

1

Когда клиент входит в систему, вы даете ему флаг сессии, как notexpired и установите его в 1.

Затем вы пишете веб-модуль, который при каждом запросе HTTP проверяет наличие notexired = 1. If что проверка выдает исключение или равна 0, вы можете запретить доступ или перенаправить на страницу с ошибкой.

или вы можете продлить сеанс из базы данных, если вы сохраняете сеансы в базе данных.

Кстати, это также работает с обработчиками AJAX, в отличие от хакеров класса базы.

+0

Вы имеете в виду обработчик HTTP? –

+0

Нет, я имею в виду веб-модуль. См. Http://www.15seconds.com/issue/020417.htm –

+0

Я никогда не сталкивался с ними, просто сделал поиск по Google, все, что я получаю, это обработчики HTTP, есть ли у вас ссылка? Возможно, это то же самое, что и у –

0

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

Смежные вопросы