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

Session.Clear()和Session.Abandon()都消除了会话variables。 据我了解,放弃()结束当前会话,并导致创build一个新的会话,从而导致结束和启动事件触发。

在大多数情况下,最好调用Abandon(),例如将用户login。 有没有我会使用Clear()的场景? 性能差异有多大?

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

Session.Clear()只是删除 Object 中的所有值 (内容)。 具有相同密钥的会话仍然活着。

所以,如果你使用Session.Abandon() ,你将失去那个特定的会话,用户将得到一个新的会话密钥。 例如,当用户注销时,可以使用它。

使用Session.Clear() ,如果你想让用户保持在同一个会话中(如果你不想让用户重新login),并重置所有会话特定的数据。

只有在用户注销时使用Session.Clear()才能构成安全漏洞。 由于就Web服务器而言,会话仍然有效。 那么嗅探并获取会话标识并劫持该会话是一件相当琐碎的事情。

出于这个原因,使用Session.Abandon()会更安全,更合理地使用Session.Abandon()来销毁会话,创build一个新的会话(即使注销UI页面是新会话的一部分,新会话将没有任何用户的细节,劫持新的会话将相当于有一个新的会议,因此它将是静音)。

我仍然不确定真实世界的例子是在哪里使用Session.Abondon()Session.Clear()

我可以理解…如果用户点击你的注销链接,并把他们带到你的“你已经注销”页面….他们的浏览器会话仍在继续,但你想删除存储在会话中的信息。 如果您放弃了会话,则会立即为“您已注销”页面创build一个新会话。

Session.Abandon如上所述破坏会话,所以你应该使用这个来logging某人。 我认为Session.Clear一个很好的用法是在电子商务网站上购物篮。 这样篮子被清除而不用注销用户。

我有这个问题,并尝试这两个,但必须解决像“pageEditState”废话,但不能删除用户信息,以免我不得不再次查找它。

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