Session.Abandon()和Session.Clear()之间的区别是什么

时间:2009-09-24 08:41:08

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

销毁会话和删除其值有什么区别?你能举一个证明这个的例子吗?

我搜索了这个问题,但没有掌握总答案。一些答案是:

  • Session.Abandon()销毁会话
  • Session.Clear()只删除所有值

一位朋友告诉我:

  

清除会话不会取消设置   会话,它仍然存在   用户的相同ID但有   价值只是清除。

     

放弃会破坏会话   完全,意味着你需要   尽可能开始新的会议   在会话中存储更多值   对于那个用户。

以下代码有效且不会引发任何异常。

Session.Abandon();
Session["tempKey1"] = "tempValue1";
  

当你放弃()一个会话,你(或   而不是用户)将得到一个新的   的SessionID

当我测试Session时,当我放弃会话时它没有做任何改变。

我发现一个区别: session.Abandon()引发Session_End事件

9 个答案:

答案 0 :(得分:139)

Clear - 从会话状态集合中删除所有键和值。

Abandon - 删除会话中存储的所有对象。如果未明确调用Abandon方法,则服务器会在会话超时时删除这些对象并销毁会话。
它还引发了Session_End之类的事件。

Session.Clear可以与从书架中删除所有书籍进行比较,而Session.Abandon更像是扔掉整个书架

你说:

  

当我测试Session时,当我放弃会话时它没有做任何改变。

当您在一个请求中执行时,这是正确的 在下一个请求中,会话将是不同的。但是session ID can be reused以便id保持不变。

如果您将使用Session.Clear,您将在许多请求中拥有相同的会话。

通常,在大多数情况下,您需要使用Session.Clear 如果您确定用户将要离开您的网站,您可以使用Session.Abandon。

回到差异:

  1. Abandon引发了Session_End请求。
  2. Clear会立即删除项目,Abandon不会。
  3. Abandon释放SessionState对象及其项目,以便可以收集垃圾以释放资源。 Clear保持SessionState和与之关联的资源。

答案 1 :(得分:19)

当您Abandon()一个会话时,您(或者更确切地说是用户)将获得一个新的SessionId(在下一个请求中)。 当您Clear()会话时,将删除所有存储的值,但SessionId保持不变。

答案 2 :(得分:8)

这是上面各种回复所涵盖的 sort ,但是我第一次阅读这篇文章时,我错过了一个重要的事实,这导致了我的代码中的一个小错误......

Session.Clear()将清除所有键的值,但不会导致会话结束事件触发。

Session.Abandon()不会清除当前请求的值。如果请求另一个页面,则该值将消失。然而,放弃将抛出事件。

那么,在我的情况下(也许在你的情况下?),我需要Clear()后跟Abandon()

答案 3 :(得分:4)

  

此代码有效并且不会抛出任何异常:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

这是因为当调用Abandon方法时,当前的Session对象排队等待删除但实际上并没有被删除,直到当前页面上的所有脚本命令都被处理完毕。这意味着您可以在与调用Abandon方法相同的页面上访问存储在Session对象中的变量,但不能访问任何后续Web页面。

例如,在以下脚本中,第三行打印值Mary。这是因为在服务器处理完脚本之前,Session对象不会被销毁。

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

如果在后续网页上访问变量MyName,则为空。这是因为当包含上一个示例的页面完成处理时,MyName被前一个Session对象销毁。

来自MSDN Session.Abandon

答案 4 :(得分:3)

清除会话会删除存储在那里的值,但您仍然可以在那里添加新值。在销毁会话后,您无法在那里添加新值。

答案 5 :(得分:3)

clear - 从会话状态集合中删除一个或多个值..

放弃 - 从会话中删除或删除会话对象..

答案 6 :(得分:1)

Session.Abandon() 

将摧毁/终止整个会话。

Session.Clear()

删除/清除会话数据(即当前会话中的键和值),但会话将处于活动状态。

与Session.Abandon()方法相比,Session.Clear()不会创建新会话,只会使会话中的所有变量都为NULL。

只要浏览器未关闭,会话ID在两种情况下都将保持相同。

Session.RemoveAll()

它从会话状态集合中删除所有键和值。

Session.Remove()

它从会话状态集合中删除一个项目。

Session.RemoveAt()

它从会话状态集合中删除指定索引处的项目。

Session.TimeOut()

此属性指定分配给应用程序的Session对象的超时时间。 (时间以分钟为单位)。

如果用户在超时期限内未刷新或请求页面,则会话结束。

答案 7 :(得分:0)

sessionid的存在可能导致会话固定攻击,这是PCI合规性的一个重点。要删除sessionid并克服会话固定攻击,请阅读此解决方案 - How to avoid the Session fixation vulnerability in ASP.NET?

答案 8 :(得分:0)

我认为使用Session.Clear()而不是使用Session.Abandon()会很方便。

因为稍后调用后会话中的值仍然存在,但在调用前者后会被删除。