Вопрос

В чем разница между уничтожением сеанса и удалением его значений?Не могли бы вы, пожалуйста, привести пример, демонстрирующий это?

Я искал этот вопрос, но не уловил полного ответа.Вот некоторые ответы:

  • Session.Abandon() уничтожает сеанс
  • Session.Clear() просто удаляет все значения

Один друг рассказал мне об этом:

Очистка сессии не установлено сессии, он все еще существует с и тот же идентификатор для пользователя, но и с значения просто очищается.

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

Приведенный ниже код работает и не создает никаких исключений.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

Когда вы отказываетесь() от сеанса, вы (или скорее пользователь) получите новый Идентификатор сеанса

Когда я тестирую сеанс, это не вносит никаких изменений, когда я покидаю сеанс.

Я просто нахожу одно отличие:session.Abandon() повышает Session_End событие

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

Решение

Очистить - Удаляет все ключи и значения из коллекции состояний сеанса.

Отказаться - удаляет все объекты, сохраненные в Сеансе.Если вы не вызываете метод Abandon явно, сервер удаляет эти объекты и уничтожает сеанс по истечении времени ожидания сеанса.
Это также вызывает такие события, как Session_End Окончание сессии.

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

Ты говоришь:

Когда я тестирую сеанс, это не вносит никаких изменений, когда я покидаю сеанс.

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

Если вы будете использовать Session.Очистите, у вас будет один и тот же сеанс во многих запросах.

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

Итак, вернемся к различиям:

  1. Отказ вызывает запрос Session_End.
  2. Очистить удаляет элементы немедленно, отказаться - нет.
  3. Abandon освобождает объект SessionState и его элементы, чтобы он мог собирать мусор для освобождения ресурсов.Clear сохраняет состояние сеанса и связанные с ним ресурсы.

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

Когда ты Abandon() сеанс, вы (или, скорее, пользователь) получите новый идентификатор сеанса (при следующем запросе).Когда ты Clear() во время сеанса все сохраненные значения удаляются, но идентификатор сеанса остается нетронутым.

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

Session.Clear() очистит значения всех ключей, но НЕ вызовет срабатывания события завершения сеанса.

Session.Abandon() не будет очищать значения в текущем запросе.ЕСЛИ будет запрошена другая страница, значения для этой будут удалены.Однако abandon ПРИВЕДЕТ к отмене события.

Итак, в моем случае (и, возможно, в вашем?) мне нужно было Clear() за которым следует Abandon().

этот код работает и не создает никаких исключений:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

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

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

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

От Сеанс MSDN.Отказаться

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

очистить - удаляет ключ или значения из коллекции состояний сеанса..

отказаться - удалить его или удаленные объекты сеанса из сеанса..

Session.Abandon() 

уничтожит / kill весь сеанс.

Session.Clear()

удаляет / очищает данные сеанса (т.е.ключи и значения из текущего сеанса), но сеанс будет живым.

Сравните с сеансом.Метод Abandon(), сеанс.Clear() не создает новый сеанс, он просто переводит все переменные в сеансе в значение NULL.

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

Session.RemoveAll()

Он удаляет все ключи и значения из коллекции состояний сеанса.

Session.Remove()

Он удаляет элемент из коллекции состояний сеанса.

Session.RemoveAt()

Он удаляет элемент с указанным индексом из коллекции состояний сеанса.

Session.TimeOut()

Это свойство определяет период ожидания, назначенный объекту сеанса для приложения.(время будет указано в минутах).

Если пользователь не обновит или не запросит страницу в течение периода ожидания, сеанс завершается.

Наличие sessionid может вызвать атаку с фиксацией сеанса, которая является одним из пунктов соответствия PCI.Чтобы удалить идентификатор сеанса и преодолеть атаку с фиксацией сеанса, прочитайте это решение - Как избежать уязвимости фиксации сеанса в ASP.NET ?.

Я думаю, это было бы удобно в использовании Session.Clear() вместо того, чтобы использовать Session.Abandon().

Потому что значения все еще существуют в сеансе после вызова позже, но удаляются после вызова первого.

this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Здесь следует отметить одну вещь: сеанс.Очистить, удалить элементы немедленно, но сеанс.Abandon помечает сеанс, который будет отменен в конце текущего запроса.Это просто означает, что предположим, вы попытались получить доступ к значению в коде сразу после выполнения команды session.abandon, оно все еще будет там.Так что не расстраивайтесь, если ваш код просто не работает даже после выдачи session.abandon команда и немедленно выполняет некоторую логику с сессией.

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