114

销毁会话和删除它的值有什么区别?你能提供一个例子来证明这一点吗?

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

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

一位朋友告诉我:

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

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

下面的代码有效并且不会引发任何异常。

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

当您 Abandon() 会话时,您(或者更确切地说是用户)将获得一个新的 SessionId

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

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

4

10 回答 10

153

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

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

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

你说:

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

当您仅在一个请求中执行此操作时,这是正确的。
在下一个请求中,会话将有所不同。但是会话 ID 可以重复使用,以便 id 保持不变。

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

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

所以回到差异:

  1. Abandon 提出 Session_End 请求。
  2. Clear 会立即删除项目,Abandon 不会。
  3. Abandon 释放 SessionState 对象及其项目,以便它可以收集垃圾以释放资源。Clear 保持 SessionState 和与之关联的资源。
于 2009-09-24T09:09:49.243 回答
20

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

于 2009-09-24T08:48:53.277 回答
9

This is sort of covered by the various responses above, but the first time I read this article I missed an important fact, which led to a minor bug in my code...

Session.Clear() will CLEAR the values of all the keys but will NOT cause the session end event to fire.

Session.Abandon() will NOT clear the values on the current request. IF another page is requested, the values will be gone for that one. However, abandon WILL throw the event.

So, in my case (and perhaps in yours?), I needed Clear() followed by Abandon().

于 2011-07-15T22:51:56.243 回答
6

此代码有效并且不会引发任何异常:

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

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

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

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

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

来自MSDN Session.Abandon

于 2014-12-23T10:58:31.707 回答
3

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

于 2009-09-24T08:46:22.107 回答
3

clear-its 从会话状态集合中删除键或值..

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

于 2009-09-25T10:47:42.680 回答
1
Session.Abandon() 

将销毁/杀死整个会话。

Session.Clear()

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

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

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

Session.RemoveAll()

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

Session.Remove()

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

Session.RemoveAt()

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

Session.TimeOut()

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

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

于 2016-09-27T11:11:53.587 回答
0

sessionid 的存在可能导致会话固定攻击,这是 PCI 合规性的重点之一。要删除 sessionid 并克服会话固定攻击,请阅读此解决方案 -如何避免 ASP.NET 中的会话固定漏洞?.

于 2011-06-09T06:02:10.293 回答
0

我认为使用Session.Clear()而不是使用Session.Abandon().

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

于 2012-03-26T14:05:28.727 回答
0
this code works and dont throw any exception:

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

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

于 2016-12-05T06:55:21.670 回答