120

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

在大多数情况下调用 Abandon() 似乎更可取,例如注销用户。有没有我会使用 Clear() 的场景?性能差异很大吗?

4

4 回答 4

175

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

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

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

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

于 2008-12-07T08:25:48.250 回答
14

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

出于这个原因,在注销用户时,使用 Session.Abandon() 会更安全、更明智,这样会销毁会话并创建新会话(即使注销 UI 页面将是新会话的一部分,新会话中不会包含任何用户详细信息,并且劫持新会话将等同于进行新会话,因此它将是静音的)。

于 2011-10-21T13:12:59.107 回答
3

Session.Abandon如上所述破坏会话,因此您应该在注销某人时使用它。我认为一个很好的用途Session.Clear是用于电子商务网站上的购物篮。这样一来,购物篮就可以在不注销用户的情况下被清除。

于 2012-05-15T10:14:00.840 回答
0

我遇到了这个问题并尝试了两者,但不得不解决像“pageEditState”这样的废话,但不删除用户信息,以免我不得不再次查找它。

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
于 2008-12-07T14:34:08.927 回答