在ASP.NET中,什么时候应该使用Session.Clear()而不是Session.Abandon()?


118

Session.Clear()和Session.Abandon()都摆脱了会话变量。据我了解,Abandon()结束当前会话,并导致创建一个新会话,从而导致End和Start事件触发。

在大多数情况下,最好是调用Abandon(),例如注销用户。在某些情况下,我会使用Clear()?在性能上有很大的不同吗?

Answers:


172

Session.Abandon() 销毁会话,并触发Session_OnEnd事件

Session.Clear()只是从对象中删除所有值(内容)。具有相同密钥的会话仍然有效。

因此,如果使用Session.Abandon(),则会丢失该特定会话,并且用户将获得一个新的会话密钥。例如,当用户注销时,您可以使用它。

使用Session.Clear(),如果你想要用户在同一个会话中剩余的(如果你不希望用户重新登录,例如)和重置所有会话特定数据。


1
我相信最好使用RemoveAll()而不是Clear(),因为“ Darin Dimitrov”已在此处建议stackoverflow.com/a/3931344/713246
Bibhu 2013年

4
@Bibhu:他如何建议RemoveAll()比Clear()好?我在他的回答中看到的全部是RemoveAll()调用Clear(),并且在功能上似乎是相同的。
亚当·米勒

1
只是用作Session.Abandon()使用Windows身份验证的内部应用程序上的“登出”-用户不必重新进行身份验证(Chrome,FF),但该会话已
终止

13

仅当用户注销时使用Session.Clear()才会造成安全漏洞。就Web服务器而言,会话仍然有效。因此,嗅探,获取会话ID并劫持该会话是一件相当琐碎的事情。

出于这个原因,注销用户时,使用Session.Abandon()会更安全,更明智,以便破坏该会话并创建一个新会话(即使注销UI页面将是新会话的一部分,新会话中将不会包含任何用户详细信息,而劫持新会话将等同于拥有一个新会话,因此它将是静音的)。


4
劫持空会话的目的是什么?劫机者仍将必须登录,并且他们的数据没有意外提供给新用户。
2003年

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);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.