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

销毁会话和删除其值之间的区别是什么? 您能提供一个示例来说明这一点吗?

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

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

一个朋友告诉我:

清除会话不会取消设置 会话,它仍然存在于 用户的 ID 相同,但使用 简单清除的值。

放弃会破坏会议 completely, meaning that you need to 开始一个新的疗程 存储会话中的任何更多值 为了那个用户。

下面的代码可以工作,不会抛出任何异常。

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

当您放弃某个会话时,您(或 而不是用户)将获得一个新的 SessionId

当我测试 Session 时,当我放弃会话时,它不会做任何更改。

我只发现了一点不同: 引发 Session_End事件

127613 次浏览

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

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

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

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

Session.Clear can be compared to 从书架上取下所有的书, while Session.Abandon is more like 把整个架子都扔了.

你说:

当我测试 Session 时,当我放弃会话时,它不会做任何更改。

这是正确的,而你正在做它 只有一个要求
On the next request the session will be different. But the 会话 ID 可以重用 so that the id will remain the same.

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

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

那么,回到差异上来:

  1. 放弃引发 Session _ End 请求。
  2. Clear removes items immidiately, Abandon does not.
  3. 放弃释放 SessionState 对象及其项,这样它就可以对收集的垃圾进行处理以释放资源。Clear 保持与会话状态和资源关联。

Clear-从会话状态集合中删除键或值。

从会话中删除或删除会话对象。

Sessionid 的存在会导致会话固定攻击,这是 PCI 依从性的关键之一。要移除会话标记并克服会话固定攻击,请阅读此解决方案 -如何避免 ASP.NET 中的会话固定漏洞?

这是以上各种响应所涵盖的 sort,但是我第一次阅读本文时忽略了一个重要的事实,这个事实导致了我的代码中的一个小错误..。

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

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.

因此,在我的情况下(也许在你的情况下?) ,我需要 Clear()后面跟着 Abandon()

我认为使用 Session.Clear()比使用 Session.Abandon()更方便。

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

这段代码可以工作,不要抛出任何异常:

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

It's because when the Abandon method is called, the current Session object is queued for deletion but is not actually deleted until all of the script commands on the current page have been processed. This means that you can access variables stored in the Session object on the same page as the call to the Abandon method but not in any subsequent Web pages.

For example, in the following script, the third line prints the value Mary. This is because the Session object is not destroyed until the server has finished processing the script.

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

If you access the variable MyName on a subsequent Web page, it is empty. This is because MyName was destroyed with the previous Session object when the page containing the previous example finished processing.

MSDN 会议,放弃

Session.Abandon()

会毁掉整个会议。

Session.Clear()

移除/清除会话数据(即当前会话中的键和值) ,但会话将是活动的。

Compare to Session.Abandon() method, Session.Clear() doesn't create the new session, it just make all variables in the session to NULL.

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

Session.RemoveAll()

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

Session.Remove()

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

Session.RemoveAt()

It deletes an item at a specified index from the session-state collection.

Session.TimeOut()

This property specifies the time-out period assigned to the Session object for the application. (the time will be specified in minutes).

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

this code works and dont throw any exception:


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

有一点需要注意。除会话外,立即清除删除项。“放弃”标记在当前请求结束时要放弃的会话。这仅仅意味着,假设您在执行 session.dump 命令之后尝试访问代码中的 value,那么它仍然存在。因此,如果您的代码即使在发出 session.dump 命令并立即对会话执行某些逻辑之后仍然无法工作,也不要感到困惑。