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。
所以回到差异:
- 放弃引发Session_End请求。
- 清除消除项目,放弃不。
- 放弃释放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命令后,您的代码仍然无法正常工作,并立即在会话中执行一些逻辑,请不要感到困惑。