Session.Clear()和Session.Abandon()都摆脱了会话变量。据我了解,Abandon()结束当前会话,并导致创建一个新会话,从而导致End和Start事件被触发。
在大多数情况下,最好调用Abandon(),例如将用户注销。有没有我使用Clear()的情况?是否存在很大的性能差异?
答案 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);
}
}