Как явно установить время окончания сеансов asp.net ТОЛЬКО при закрытии браузера или явном логу? - PullRequest
5 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 9 ]

5 голосов
/ 18 сентября 2008

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

3 голосов
/ 18 сентября 2008

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

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

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

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

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

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

3 голосов
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

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

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

1 голос
/ 18 сентября 2008

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

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

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

Но не используйте сеанс на стороне сервера ASP.NET, а используйте только куки.

0 голосов
/ 19 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

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

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

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

0 голосов
/ 18 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

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

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

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