В чем разница между уничтожением сеанса и удалением его значений? Не могли бы вы привести пример, демонстрирующий это?
Я искал этот вопрос, но не понял полного ответа. Вот некоторые ответы:
Session.Abandon()
разрушает сеансSession.Clear()
просто удаляет все значения
Друг сказал мне это:
Очистка сеанса не отменяет сеанс, он все еще существует с тем же идентификатором для пользователя, но с просто очищенными значениями.
Отказ полностью уничтожит сеанс, а это означает, что вам нужно начать новый сеанс, прежде чем вы сможете сохранить какие-либо другие значения в сеансе для этого пользователя.
Приведенный ниже код работает и не вызывает никаких исключений.
Session.Abandon();
Session["tempKey1"] = "tempValue1";
Когда вы Abandon () a Session, вы (или, скорее, пользователь) получите новый SessionId
Когда я тестирую сеанс, он не вносит никаких изменений, когда я прекращаю сеанс.
Я просто нахожу одно отличие:
session.Abandon()
вызывает Session_End
событие
источник
Ответы:
Очистить - удаляет все ключи и значения из коллекции состояний сеанса.
Abandon - удаляет все объекты, хранящиеся в сеансе. Если вы не вызываете метод Abandon явно, сервер удаляет эти объекты и уничтожает сеанс по истечении времени ожидания сеанса.
Он также вызывает такие события, как Session_End .
Session.Clear можно сравнить с удалением всех книг с полки , в то время как Session.Abandon больше похож на выброс всей полки .
Ты говоришь:
Это правильно, если вы делаете это только в рамках одного запроса .
При следующем запросе сеанс будет другим. Но идентификатор сеанса можно использовать повторно, так что идентификатор останется прежним.
Если вы будете использовать Session.Clear, у вас будет один и тот же сеанс во многих запросах.
Как правило, в большинстве случаев вам необходимо использовать Session.Clear.
Вы можете использовать Session.Abandon, если уверены, что пользователь собирается покинуть ваш сайт.
Итак, вернемся к различиям:
источник
Session.Clear
это можно сравнить с немедленным удалением всех книг с полки , в то время какSession.Abandon
это больше похоже на высказывание «выбросьте всю полку и дайте мне знать, когда закончите ».Когда вы
Abandon()
используете Session, вы (или, скорее, пользователь) получите новый SessionId (при следующем запросе). Когда вы находитесьClear()
в сеансе, все сохраненные значения удаляются, но SessionId остается неизменным.источник
Это своего родом из охватываются различными реакциями выше, но первый раз , когда я прочитал эту статью , я пропустил один важный факт, что привело к незначительной ошибке в моем коде ...
Session.Clear()
ОЧИСТИТ значения всех ключей, но НЕ приведет к срабатыванию события завершения сеанса.Session.Abandon()
НЕ очистит значения в текущем запросе. ЕСЛИ запрашивается другая страница, значения для этой страницы пропадают. Однако отказаться БУДЕТ отбрасывать событие.Итак, в моем случае (и, возможно, в вашем?) Мне нужно было
Clear()
следоватьAbandon()
.источник
Это связано с тем, что при вызове метода Abandon текущий объект сеанса ставится в очередь на удаление, но фактически не удаляется, пока все команды сценария на текущей странице не будут обработаны. Это означает, что вы можете получить доступ к переменным, хранящимся в объекте Session на той же странице, что и вызов метода Abandon, но не на любых последующих веб-страницах.
Например, в следующем сценарии в третьей строке печатается значение Мэри. Это связано с тем, что объект Session не уничтожается, пока сервер не завершит обработку сценария.
Если вы обращаетесь к переменной MyName на следующей веб-странице, она пуста. Это связано с тем, что MyName было уничтожено с помощью предыдущего объекта Session, когда страница, содержащая предыдущий пример, завершила обработку.
из MSDN Session.Abandon
источник
Очистка сеанса удаляет значения, которые были там сохранены, но вы все равно можете добавлять туда новые. После разрушения сеанса вы не можете добавлять туда новые значения.
источник
clear - удалить ключ или значения из коллекции состояния сеанса.
отказаться от него удалить или удалить объекты сеанса из сеанса ..
источник
уничтожит / убьет всю сессию.
удаляет / очищает данные сеанса (т.е. ключи и значения из текущего сеанса), но сеанс будет активен.
По сравнению с методом Session.Abandon (), Session.Clear () не создает новый сеанс, он просто переводит все переменные в сеансе в NULL.
Идентификатор сеанса останется прежним в обоих случаях, пока браузер не закрыт.
Он удаляет все ключи и значения из коллекции состояний сеанса.
Он удаляет элемент из коллекции состояний сеанса.
Он удаляет элемент по указанному индексу из коллекции состояний сеанса.
Это свойство определяет период ожидания, назначенный объекту сеанса для приложения. (время будет указано в минутах).
Если пользователь не обновляет или не запрашивает страницу в течение периода ожидания, сеанс завершается.
источник
Наличие sessionid может вызвать атаку фиксации сеанса, что является одним из факторов соответствия PCI. Чтобы удалить sessionid и преодолеть атаку фиксации сеанса, прочтите это решение - Как избежать уязвимости фиксации сеанса в ASP.NET? .
источник
Думаю, было бы удобнее использовать
Session.Clear()
, чем использоватьSession.Abandon()
.Потому что значения все еще существуют в сеансе после вызова позже, но удаляются после вызова первого.
источник
Здесь следует отметить, что Session.Clear удаляет элементы немедленно, но Session.Abandon отмечает сеанс, который следует прервать, в конце текущего запроса. Это просто означает, что предположим, что вы попытались получить доступ к значению в коде сразу после выполнения команды session.abandon, оно все еще будет там. Так что не запутайтесь, если ваш код просто не работает даже после выполнения команды session.abandon и немедленного выполнения некоторой логики с сеансом.
источник