【发布时间】:2011-03-02 14:10:17
【问题描述】:
ASP.Net 中Session.Abandon() 和Session.Clear() 有什么区别?
【问题讨论】:
-
可能重复:stackoverflow.com/questions/1470445/…(是的,我知道这已经晚了五年多了。我刚刚注意到其他地方的一个论坛帖子同时发布了这两个帖子。:))
标签: asp.net session session-state
ASP.Net 中Session.Abandon() 和Session.Clear() 有什么区别?
【问题讨论】:
标签: asp.net session session-state
Session.Abandon() 将结束当前会话。 Session_End 将被触发,下一个请求将触发 Session_Start 事件。
Session.Clear 只会清除会话数据,会话将保持活动状态。
只要浏览器没有关闭,会话 ID 在这两种情况下都将保持不变。
简而言之:
Session.Abandon(); 取消当前的Session。
Session.Clear(); 清除 Session 状态中的所有值。
【讨论】:
Session.Abandon()
将销毁/杀死整个会话。
Session.Clear()
删除/清除会话数据(即当前会话中的键和值),但会话将处于活动状态。
与 Session.Abandon() 方法相比,Session.Clear() 不会创建新会话,它只是将会话中的所有变量设置为 NULL。
只要浏览器没有关闭,会话 ID 在这两种情况下都将保持不变。
【讨论】:
根据我的经验,这里有几点需要注意:
Session.Abandon() 不会使当前会话无效。如果您重放旧请求,它们会执行得很好。
但是,在你调用它之后,设置废弃会话字典的内容并没有永久的效果。下一个请求会获得一个全新的会话字典(即使您通过重放先前的请求来使用相同的会话 ID)并且您之前对其所做的任何更改(在调用该方法之后)都不存在。
所以,Session.Abandon() 似乎完全停止了整个会话的持久性,而Session.Clear() 只删除了它的数据。
此外,如果您需要保护您的应用程序免受重放攻击,您应该添加一些验证会话的逻辑,而不是依赖任何这些内置方法。这些似乎只用于管理会话数据的持久性,而不是用于保护您的应用程序。
【讨论】: