В ASP.NET, когда я должен использовать Session.Clear (), а не Session.Abandon ()? - PullRequest
109 голосов
/ 07 декабря 2008

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

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

Ответы [ 5 ]

165 голосов
/ 07 декабря 2008

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

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

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

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

13 голосов
/ 21 октября 2011

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

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

5 голосов
/ 30 октября 2009

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

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

3 голосов
/ 15 мая 2012

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

0 голосов
/ 07 декабря 2008

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

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