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

销毁一个会话并删除它的值有什么区别? 你能举一个例子来certificate这一点吗?

我search了这个问题,但是没有把握完整的答案。 一些答案是:

  • Session.Abandon()破坏会话
  • Session.Clear()只是删除所有的值

有朋友告诉我这个:

清除会话将不会取消会话,它仍然存在与用户相同的ID,但值简单地清除。

放弃会完全破坏会话,这意味着您需要开始一个新的会话,然后才能在该会话中为该用户存储更多的值。

下面的代码工作,不会抛出任何exception。

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

当你放弃()一个会话,你(或者更确切的说是用户)会得到一个新的SessionId

当我testing会话时,我放弃会话时没有任何改变。

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

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

放弃 – 删除存储在会话中的所有对象。 如果不显式调用Abandon方法,则服务器将在会话超时时删除这些对象并销毁会话。
它也引发了像Session_End这样的事件。

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

你说:

当我testing会话时,我放弃会话时没有任何改变。

这是正确的,而你只是在一个请求中
在下一个请求会议将是不同的。 但会话ID可以重复使用 ,使id保持不变。

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

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

所以回到差异:

  1. 放弃引发Session_End请求。
  2. 清除消除项目,放弃不。
  3. 放弃释放SessionState对象及其项目,以便可以收集垃圾回收以释放资源。 清除保持与其关联的SessionState和资源。

当你Abandon()一个Session的时候,你(或者说用户)会得到一个新的SessionId(在下一个请求中)。 当您Clear()会话时,所有存储的值将被删除,但SessionId保持不变。

这是上面的各种反应,但我第一次读这篇文章,我错过了一个重要的事实,这导致了我的代码中的一个小错误…

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

Session.Abandon()不会清除当前请求的值。 如果请求另一个页面,那么这个值将被删除。 但是,放弃将会抛出事件。

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

清除会话将删除存储在那里的值,但您仍然可以在其中添加新的值。 破坏会话后,你不能在那里添加新的值。

清除 – 从会话状态收集中删除键或值..

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

这段代码工作,不要抛出任何exception:

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

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

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

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

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

来自MSDN Session.Abandon

sessionid的存在会导致会话固定攻击,这是PCI合规性的一个要点。 要删除sessionid并克服会话修复攻击,请阅读此解决scheme – 如何避免ASP.NET中的会话修复漏洞? 。

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

因为值在调用之后仍然存在于会话中,但是在调用前者之后被移除。

 Session.Abandon() 

将摧毁/杀死整个会话。

 Session.Clear() 

删除/清除会话数据(即来自当前会话的密钥和值),但会话是活着的。

与Session.Abandon()方法相比,Session.Clear()不会创build新的会话,只是将会话中的所有variables都设置为NULL。

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

 Session.RemoveAll() 

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

 Session.Remove() 

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

 Session.RemoveAt() 

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

 Session.TimeOut() 

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

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

 this code works and dont throw any exception: Session.Abandon(); Session["tempKey1"] = "tempValue1"; 

有一件事要注意,Session.Clear立即删除项目,但Session.Abandon标记会话在当前请求结束时被放弃。 这只是意味着假设你刚刚在执行session.abandon命令之后尝试访问代码中的值,它将仍然存在。 因此,即使在发布session.abandon命令后,您的代码仍然无法正常工作,并立即在会话中执行一些逻辑,请不要感到困惑。

Interesting Posts