-->

是什么Session.Abandon()和Session.Clear之间的差异()(What is

2019-07-19 06:58发布

是什么摧毁一个会话和删除其值之间的差异? 能否请您提供一个例子证明这一点?

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

  • 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如果你确定用户将要离开你的网站。

所以回的区别:

  1. 放弃加薪要求Session_End中。
  2. 清除immidiately删除的项目,放弃不。
  3. 因此它可以收集来释放资源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()