Коли в ASP.NET потрібно використовувати Session.Clear (), а не Session.Abandon ()?


118

І Session.Clear (), і Session.Abandon () позбавляються від змінних сеансів. Як я розумію, Abandon () закінчує поточний сеанс і викликає створення нового сеансу, таким чином, викликаючи події кінця та запуску.

Здається, переважніше викликати Abandon () у більшості випадків, наприклад, виходу з користувача. Чи існують сценарії, де я б замість цього використовував Clear ()? Чи є велика різниця у продуктивності?

Відповіді:


172

Session.Abandon() знищує сеанс і запускається подія Session_OnEnd .

Session.Clear()просто видаляє всі значення (вміст) з Об'єкта. Сеанс з тим самим ключем ще живий.

Отже, якщо ви користуєтесь Session.Abandon(), ви втрачаєте конкретний сеанс, і користувач отримає новий ключ сеансу. Ви можете використовувати його, наприклад, коли користувач виходить із системи.

Використовуйте Session.Clear(), якщо ви хочете, щоб користувач залишався на одному сеансі (якщо ви не хочете, щоб користувач повторно входив у систему) та скидав усі дані, пов’язані з сеансом.


1
Я вважаю , що краще використовувати RemoveAll () замість Clear (), як «Дарін Димитров» запропонував тут stackoverflow.com/a/3931344/713246
Bibhu

4
@Bibhu: Як він запропонував, щоб RemoveAll () був кращим, ніж Clear ()? Все, що я бачив у його відповіді, - це те, що RemoveAll () викликає Clear (), і, здається, функціонально ідентичний.
Адам Міллер

1
Просто використовується Session.Abandon()як "вихід" у внутрішньому додатку за допомогою автентифікації Windows - користувачам не довелося повторно підтверджувати автентифікацію (Chrome, FF), але сеанс розпочався та видано новий, який відповідав моїм вимогам
бричін

13

Тільки за допомогою Session.Clear (), коли користувач виходить із системи, може створювати отвір для захисту. Оскільки сеанс все ще діє, що стосується веб-сервера. Тоді є досить тривіальною справою нюхати та схопити Id сеансу та захопити цей сеанс.

З цієї причини під час виходу з користувача було б безпечніше і розумніше використовувати Session.Abandon (), щоб сеанс було знищено, і було створено нове сеанс (навіть незважаючи на те, що сторінка інтерфейсу виходу буде частиною нового сеансу, новий сеанс не міститиме в ньому жодної інформації про користувачів, а викрадення нового сеансу було б еквівалентно новому сеансу, отже, це буде без звуку).


4
Який би сенс викрасти порожній сеанс? Викрадачеві все одно доведеться увійти, і їхні дані не випадково надають новому користувачеві.
Trisped

3

Session.Abandonзнищує сеанс, як зазначено вище, тому ви повинні використовувати це під час виходу з когось із користувачів. Я думаю, що корисним буде використання Session.Clearкошика для покупок на веб-сайті електронної комерції. Таким чином кошик очищається без виходу користувача.


Але що робити, якщо я Session.Abandonпросто очищую конкретний кошик для покупок?
WTFZane

0

У мене виникла ця проблема, і я спробував і те, і інше, але довелося вирішити проблему з видаленням лайна типу "pageEditState", але не видаленням інформації про користувача, щоб я не шукав її ще раз.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.