2016-03-14 4 views
-1

В моем приложении .net мне нужно сохранить страницу, которая была отображена до истечения срока действия сеанса, например, если пользователь находился на странице A, а сеанс истекает, когда привет будет применяться к приложению, я должен перенаправить его на страницу A.Обнаружение окончания сеанса

Моя идея - обнаружить истечение сеанса, и если событие произойдет, сохраните данные в базе данных.

ответ

0

Я решаю проблему с javascript, подход состоит в том, чтобы иметь переменную, представляющую тайм-аут сеанса, и сделать глобальный метод javascript, объявляющий сеанс сохранения до истечения срока действия. $(document).ready(function() { var saveSessionTimer; clearTimeout(saveSessionTimer); //timerToSaveSession = sessionExpireTime - 10 seconds saveSessionTimer = setTimeout(saveSession, timerToSaveSession); });
где saveSession - это метод, который вызывает контроллер и выполняет сохранение.

0

Вы можете использовать просто переменную сеанса. На странице load проверьте, существует ли переменная, и если она больше не существует, вы можете сохранить необходимые данные.

Вы также можете получить URL-адрес, если сеанс истек. UserId должен храниться в некотором «постоянном» месте, как скрытое поле на странице, поэтому вы можете получить его также, если сессия истекло.

+0

Если я жду окончания сеанса, я не смогу сделать запрос на сохранение данных. Чтобы восстановить данные, я буду проверять, зарегистрированы ли данные, если это так, я перенаправляю пользователя – Sabrin

0

Чтобы ответить на ваш вопрос, вы можете использовать метод Session_End в global.asax, чтобы обнаружить истекающий сеанс.

К сожалению, в то время информация о странице, к которой пользователь обратился к последнему, больше не является (удобно), поэтому я сомневаюсь, что это поможет вам решить вашу основную проблему.

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

0

Вы можете сделать следующее:

1) Для каждого запроса (Application_BeginRequest) магазина в данном контексте сеанса (пользователь, URL и т.д.):

Session["LastPageData"] = new { Url = ..., }; 

2) Перед тем как сессия собирается конец, вы можете использовать эту информацию для хранения в базе данных, например:

void Session_End(Object sender, EventArgs E) { 
    // do persistence logic here based on Session["LastPageData"] 
} 

Если какая-то информация не доступна в Session_End, вы можете сохраняться информация по каждому запросу, но это будет означать дополнительные накладные расходы (для каждого запроса)

+0

Но как определить, что срок действия сеанса истечет. Я хочу, чтобы мне нужно было сделать таймер JavaScript, чтобы сообщить, что сессия скоро закончится. – Sabrin

0

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

Итак, вы можете знать, что сессия истек, только когда запрос достиг вашего сервера и запрос обрабатывается.

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

Вашего Логин URL будет выглядеть следующим образом https://myapp.com/Account/Login?returnUrl=%2FMyAccount

Здесь MyAccount последними посетили URL, где сеанс истек.

Такой же подход используется авторизацией MVC asp.net, вы можете взглянуть на нее, используя шаблон по умолчанию.

+0

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

+0

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

0

вы можете использовать Session_OnEnd, Session_End() даже в файле global.asax,

В этом случае вы можете сохранить свою ценность сеанса в БД в явном виде, потому что Session_OnEnd и Session_End не дозвонились, если сессия находится вне proc (сохранение сеанса на государственном сервере или сервере sql).

Теперь, когда пользователь снова откроет приложение, то при загрузке каждой страницы вы должны проверить значение переменной сеанса (я не уверен, что это можно сделать сам по себе в Session_Start или Apllication_Start события в global.asax), и если он имеет значение null, а затем получает последнее значение из db и перенаправляется на соответствующую страницу.

+0

Session_OnEnd не учитывает, закрывает ли пользователь свой браузер – Sabrin

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