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

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

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

Ответ 1

Session.Abandon() уничтожает сеанс и запускается событие Session_OnEnd.

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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