是什么摧毁一个会话和删除其值之间的差异? 能否请您提供一个例子证明这一点?
我搜索了这个问题,但没有把握总的答案。 有些答案是:
-
Session.Abandon()
销毁会话 -
Session.Clear()
只是删除所有值
一个朋友告诉我:
清除会议不会取消设置会话,它仍然与用户相同的ID但简单地清除值存在。
放弃将彻底摧毁了会议,这意味着你需要开始一个新的会话之前,你可以存储在该用户的会话的任何更多的价值。
下面的代码工作,并不会引发任何异常。
Session.Abandon();
Session["tempKey1"] = "tempValue1";
当你放弃()会话,你(或相当的用户)将获得一个新的SessionID
当我测试环节中,它不会作出任何改变,当我放弃了会议。
我只是觉得一个区别: session.Abandon()
引发Session_End
的事件
Answer 1:
清除 -删除从会话状态集合中的所有键和值。
放弃 -删除存储在一个会话的所有对象。 如果你不调用Abandon方法明确,服务器当会话超时删除这些对象,并破坏了会议。
这也提出了类似的事件Session_End中 。
Session.Clear可以比从货架移除所有的书籍 ,而Session.Abandon更像是丢掉了整个货架 。
你说:
当我测试环节中,它不会作出任何改变,当我放弃了会议。
而你只有一个请求内做这是正确的。
在接下来的请求的会话会有所不同。 但是, 会话ID可以重复使用 ,这样的ID将保持不变。
如果要使用Session.Clear你将有很多请求相同的会话。
一般来说,在大多数情况下,你需要使用Session.Clear。
您可以使用Session.Abandon如果你确定用户将要离开你的网站。
所以回的区别:
- 放弃加薪要求Session_End中。
- 清除immidiately删除的项目,放弃不。
- 因此它可以收集来释放资源BA垃圾抛弃释放SessionState的对象和它的项目。 清除SessionState的保持以及与之相关联的资源。
Answer 2:
当你Abandon()
会话,你(或相当的用户)将获得一个新的SessionID(在下一次请求时)。 当你Clear()
会话,所有存储的值将被删除,但会话ID保持不变。
Answer 3:
这是由上述各方面的反应有点覆盖,但我第一次读这篇文章,我错过了一个重要的事实,这导致我的代码一个小错误...
Session.Clear()
将清除所有键的值,但不会导致会话结束事件激发。
Session.Abandon()
不会对当前请求清除值。 如果请求另一个页面,该值将永远消失了的那一个。 然而,放弃将引发该事件。
所以,在我的情况(和也许在你的吗?),我需要Clear()
然后Abandon()
Answer 4:
此代码的工作和不抛出任何异常:
Session.Abandon(); Session["tempKey1"] = "tempValue1";
这是因为当Abandon方法被调用时,当前的Session对象排队等待删除,但实际上并没有被删除,直到所有的脚本都已经被处理了当前页面上的命令。 这意味着你可以在同一页面上访问存储在Session对象变量调用Abandon方法,但不得在随后的网页。
例如,在下面的脚本中,第三行打印出值玛丽。 这是因为Session对象不被破坏,直到服务器处理完脚本。
<%
Session.Abandon
Session("MyName") = "Mary"
Reponse.Write(Session("MyName"))
%>
如果您访问的后续网页上的MyName变量,它是空的。 这是因为MYNAME与以前的Session对象被破坏时,含前面例子中的页面处理完毕。
从MSDN Session.Abandon
Answer 5:
清除会话会删除被存储在那里的值,但你仍然可以有添加新的。 摧毁会议结束后,你不能有添加新值。
Answer 6:
从会话状态集合明确其删除键或值..
放弃-其删除或从会话中删除会话对象..
Answer 7:
Session.Abandon()
会破坏/杀死整个会话。
Session.Clear()
去除/清除会话数据(即,从当前会话中的键和值),但是该会话将活着。
比较Session.Abandon()方法,Session.Clear()不创建新的会话,它只是使所有变量为NULL会话。
会话ID将保持在两种情况下相同,只要在浏览器未关闭。
Session.RemoveAll()
它会从会话状态集合中的所有键和值。
Session.Remove()
它会删除会话状态集合中的项。
Session.RemoveAt()
它从会话状态集合中指定索引处删除某个项目。
Session.TimeOut()
此属性指定分配给应用程序的会话对象的超时周期。 (时间将在几分钟内指定)。
如果用户不刷新或超时期限内请求一个页面,那么会话结束。
Answer 8:
会话ID的存在可能会导致会话固定攻击是在PCI合规性的点之一。 要删除会话ID和克服会话固定攻击,读这个解决方案- 如何避免在ASP.NET会话固定漏洞? 。
Answer 9:
我认为这将是得心应手Session.Clear()
而不是使用Session.Abandon()
由于该值仍然存在于会议后呼吁之后,但在调用前被去除之后。
Answer 10:
this code works and dont throw any exception:
Session.Abandon();
Session["tempKey1"] = "tempValue1";
这里有一点要注意的是Session.Clear立即删除项目,但Session.Abandon标志着在当前请求结束时被放弃的会话。 这只是意味着,假设您试图访问值码只是在执行命令session.abandon后,将仍然存在。 所以,如果你的代码只是甚至没有发出session.abandon命令,并立即做了一些逻辑与会话后,工作不要混淆。
文章来源: What is the difference between Session.Abandon() and Session.Clear()