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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
8 315
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

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

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

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