it-roy-ru.com

В ASP.NET, когда я должен использовать Session.Clear (), а не Session.Abandon ()?

И Session.Clear (), и Session.Abandon () избавляются от переменных сеанса. Насколько я понимаю, Abandon () завершает текущий сеанс и вызывает создание нового сеанса, вызывая события End и Start.

Представляется предпочтительным вызывать Abandon () в большинстве случаев, таких как выход пользователя из системы. Существуют ли сценарии, в которых я бы использовал Clear () вместо этого? Есть большая разница в производительности?

109
Lance Fisher

Session.Abandon()уничтожает сеанс и срабатывает событие Session_OnEnd.

Session.Clear() just удаляет все значения (содержимое) из объекта. Сессия с тем же ключом еще жива.

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

Используйте Session.Clear(), если вы хотите, чтобы пользователь оставался в том же сеансе (например, если вы не хотите, чтобы пользователь повторно входил в систему), и сбросьте все специфичные для сеанса данные.

165
splattne

Только использование Session.Clear (), когда пользователь выходит из системы, может создать дыру в безопасности. Поскольку сеанс все еще действителен в отношении веб-сервера. В таком случае достаточно просто понюхать, захватить идентификатор сессии и перехватить эту сессию.

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

13
shabbirh

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

Я могу понять ... если пользователь щелкает по вашей ссылке выхода из системы и вы переходите на страницу "вы вышли из системы" ... его сеанс браузера все еще продолжается, но вы хотите удалить информацию, сохраненную в сеансе. Если вы отменили сеанс, то сразу же будет создан новый сеанс для страницы "Вы вышли из системы".

5
nick

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

3
Kasim Shafiq

У меня была эта проблема, и я попробовал и то, и другое, но мне пришлось согласиться на удаление дерьма, такого как "pageEditState", но не на удаление информации о пользователе, чтобы мне не пришлось искать ее снова.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
0
MatthewMartin