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

时间:2008-12-07 08:14:50

标签: asp.net .net session session-state

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

在大多数情况下,最好调用Abandon(),例如将用户注销。有没有我使用Clear()的情况?是否存在很大的性能差异?

5 个答案:

答案 0 :(得分:165)

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

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

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

如果您希望用户保持在同一会话中(如果您不希望用户重新登录),请使用Session.Clear()并重置所有会话特定数据。

答案 1 :(得分:13)

用户注销时仅使用Session.Clear()可能会造成安全漏洞。因为就Web服务器而言,会话仍然有效。然后,嗅探并抓住会话ID并劫持该会话是一个相当微不足道的事情。

出于这个原因,当用户注销时,使用Session.Abandon()会更安全,更明智,这样会话就会被销毁,并且会创建一个新会话(即使注销UI页面是其中的一部分)新会话,新会话中没有任何用户详细信息,劫持新会话相当于拥有一个新会话,因此它将是静音)。

答案 2 :(得分:5)

我仍然不确定您使用Session.Abondon()Session.Clear()的真实世界示例。

我可以理解......如果用户点击您的退出链接并将其带到“您已经注销”页面....他们的浏览器会话仍在继续,但您要删除存储的信息会议。如果您放弃了会话,那么将立即为“您已经注销”页面创建一个新会话。

答案 3 :(得分:3)

Session.Abandon如上所述破坏了会话,因此您应该在将某人记录下来时使用此功能。我认为Session.Clear可以很好地用于电子商务网站上的购物篮。这样就可以在不登出用户的情况下清除篮子。

答案 4 :(得分:0)

我遇到了这个问题但尝试了两个,但不得不解决像“pageEditState”这样的删除垃圾,但不删除用户信息,以免我不得不重新查找。

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