В чем разница между сессией.Отказаться () и сессии.Четкий()



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



Я искал этот вопрос, но не понимаю общего ответа. Некоторые ответы:





  • Session.Abandon() разрушает сессии


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


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




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



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




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



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



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




когда я тест Сессия, это не делает никаких изменений, когда я отказываюсь от сессии.



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

599   10  

10 ответов:

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

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

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

вы говорите:

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

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

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

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

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

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

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

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

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

Session.Abandon() не будет очищать значения в текущем запросе. Если запрашивается другая страница, значения для нее будут удалены. Тем не менее, отказаться будет бросать событие.

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

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

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

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

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

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

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

С сеанс MSDN.Оставь

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

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

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

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

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

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

Session.Abandon() 

уничтожит / убьет всю сессию.

Session.Clear()

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

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

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

Session.RemoveAll()

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

Session.Remove()

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

Session.RemoveAt()

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

Session.TimeOut()

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

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

this code works and dont throw any exception:

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

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

Comments

    Ничего не найдено.