Как явно установить срок действия сеансов asp.net ТОЛЬКО при закрытии браузера или явном входе в систему?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

По умолчанию срок действия сеанса составляет 20 минут.

Обновлять:Я не хочу, чтобы сеанс истекал до закрытия браузера.

Обновление2:Это мой сценарий.Пользователь авторизуется на сайте.Играет на сайте.Отходит от компьютера, чтобы принять душ (>20 минут ;)).Возвращается к компьютеру и должен иметь возможность поиграть.Он закрывает браузер, который удаляет cookie сеанса.В следующий раз, когда он зайдет на сайт из нового экземпляра браузера, ему придется войти в систему еще раз.

В PHP я могу установить для session.cookie_lifetime в php.ini значение ноль.

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

Решение

Если вы хотите продлить сеанс более чем на 20 минут, вы можете изменить значение по умолчанию с помощью администратора IIS или установить его в файле web.config.Например, чтобы установить тайм-аут на 60 минут в web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

Вы можете сделать то же самое для конкретного пользователя в коде с помощью:

Session.Timeout = 60

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

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

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

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

Вы можете установить короткий тайм-аут сеанса (например, 5 минут), а затем заставить страницу периодически опрашивать сервер, либо используя Javascript для запуска XmlHttpRequest каждые 2 минуты, либо используя скрытый iframe, который указывает на страницу, которая обновляется каждый раз. 2 минуты.

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

Это не новая проблема, существует несколько сценариев, которые необходимо обработать, если вы хотите уловить все варианты завершения сеанса. Вот общие примеры некоторых из них:

  1. Экземпляр или вкладка браузера закрываются.
  2. Пользователь уходит с вашего сайта, используя тот же экземпляр браузера или вкладку.
  3. Пользователи теряют соединение с Интернетом (это может включать в себя отключение питания компьютера пользователя или любые другие причины).
  4. Пользователь уходит от компьютера (или каким-либо другим образом перестает взаимодействовать с вашим сайтом).
  5. Сервер теряет питание/перезагружается.

Первые два элемента должны обрабатываться клиентом, отправляющим информацию на сервер. Обычно вы используете JavaScript для перехода на страницу выхода из системы, которая быстро завершает сеанс.

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

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

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

Это значение по умолчанию.Если у вас есть сеанс, он сохраняет его в «сеансовом файле cookie», который автоматически удаляется при закрытии браузера.

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

Поскольку сеанс, о котором вы говорите, хранится на сервере, а не на клиенте, вы не можете делать то, что хотите.

Но рассмотрите возможность не использовать сеанс на стороне сервера ASP.NET, а вместо этого полагаться только на файлы cookie.

К сожалению, из-за явной природы Интернета и отсутствия постоянной связи между сервером веб-сайта и браузером пользователя невозможно определить, когда пользователь закрыл свой браузер.Существуют события и JavaScript, которые вы можете реализовать (например.onunload), который вы можете использовать для выполнения обратных вызовов на сервер, который, в свою очередь, может «уничтожить» сеанс — Session.Abandon();

Вы можете установить продолжительность тайм-аута сеанса в файле web.config. Помните, что этот тайм-аут основан на времени, прошедшем с момента последнего вызова сервера браузером пользователя.

Тайм-аут браузера не добавлен.

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

Мой Javascript недостаточно хорош, чтобы дать вам реальные инструкции для этого;извини :(

Вы не можете, так как не можете контролировать ответ html-клиента.

Собственно, почему вам нужно это сделать?Если никто не сможет возобновить сеанс для повторного использования, срок его действия истечет через 20 минут.Если ресурсы имеют значение, установите более агрессивный срок действия сеанса (большинство хостинговых компаний сделали это, что ужасно раздражает) или используйте меньше объектов в сеансе.Старайтесь избегать любых объектов, вместо этого просто сохраняйте ключи для их получения. Это очень важная конструкция, поскольку она помогает вам масштабировать сеанс до сервера состояний, когда вы станете большим.

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

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

Однако предпочтительным подходом является использование механизма постоянного состояния с той же областью действия, что и сеанс браузера, например файла cookie, срок действия которого истекает при закрытии браузера.Этот файл cookie может содержать ровно столько информации, чтобы повторно инициировать сеанс на сервере, если срок его действия истек с момента последнего запроса.Я думаю, что в сочетании с относительно коротким (5-10 минут) тайм-аутом сеанса это дает наилучший баланс между использованием ресурсов сервера и отсутствием необходимости постоянно «перезагружать» сайт пользователя.

Ой, вы переписали вопрос.

Это абсолютно осуществимо, пока жив JavaScript.Используйте любой временный ajax.Проверьте библиотеку прототипов http://www.prototypejs.org PeriodicalExecutor или jQuery с плагином ajax + таймер.Настройте фиктивную страницу, которую ваш исполнитель будет вызывать время от времени, чтобы ваш сеанс всегда был активен, если только он не выйдет из системы (заодно уничтожит таймер ajax) или не закроет браузер (что означает, что исполнитель все равно будет убит)

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