Session.Clear() 和 Session.Abandon() 都摆脱了会话变量。据我了解, Abandon() 结束当前会话,并导致创建一个新会话,从而导致 End 和 Start 事件触发。
在大多数情况下调用 Abandon() 似乎更可取,例如注销用户。有没有我会使用 Clear() 的场景?性能差异很大吗?
Session.Clear() 和 Session.Abandon() 都摆脱了会话变量。据我了解, Abandon() 结束当前会话,并导致创建一个新会话,从而导致 End 和 Start 事件触发。
在大多数情况下调用 Abandon() 似乎更可取,例如注销用户。有没有我会使用 Clear() 的场景?性能差异很大吗?
Session.Abandon()
销毁会话并触发Session_OnEnd 事件。
Session.Clear()
只是从对象中删除所有值(内容)。具有相同密钥的会话仍然存在。
因此,如果您使用Session.Abandon()
,您将丢失该特定会话,并且用户将获得一个新的会话密钥。例如,您可以在用户注销时使用它。
如果Session.Clear()
您希望用户保留在同一会话中(例如,如果您不希望用户重新登录)并重置所有会话特定数据,请使用 。
仅在用户注销时使用 Session.Clear() 可能会造成安全漏洞。就 Web 服务器而言,会话仍然有效。然后,嗅探、获取会话 ID 并劫持该会话是一件相当简单的事情。
出于这个原因,在注销用户时,使用 Session.Abandon() 会更安全、更明智,这样会销毁会话并创建新会话(即使注销 UI 页面将是新会话的一部分,新会话中不会包含任何用户详细信息,并且劫持新会话将等同于进行新会话,因此它将是静音的)。
Session.Abandon
如上所述破坏会话,因此您应该在注销某人时使用它。我认为一个很好的用途Session.Clear
是用于电子商务网站上的购物篮。这样一来,购物篮就可以在不注销用户的情况下被清除。
我遇到了这个问题并尝试了两者,但不得不解决像“pageEditState”这样的废话,但不删除用户信息,以免我不得不再次查找它。
public static void RemoveEverythingButUserInfo()
{
foreach (String o in HttpContext.Current.Session.Keys)
{
if (o != "UserInfoIDontWantToAskForAgain")
keys.Add(o);
}
}