В 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);
}
}