销毁会话和删除其值有什么区别?你能举一个证明这个的例子吗?
我搜索了这个问题,但没有掌握总答案。一些答案是:
Session.Abandon()
销毁会话Session.Clear()
只删除所有值一位朋友告诉我:
清除会话不会取消设置 会话,它仍然存在 用户的相同ID但有 价值只是清除。
放弃会破坏会话 完全,意味着你需要 尽可能开始新的会议 在会话中存储更多值 对于那个用户。
以下代码有效且不会引发任何异常。
Session.Abandon();
Session["tempKey1"] = "tempValue1";
当你放弃()一个会话,你(或 而不是用户)将得到一个新的 的SessionID
当我测试Session时,当我放弃会话时它没有做任何改变。
我发现一个区别:
session.Abandon()
引发Session_End
事件
答案 0 :(得分:139)
Clear - 从会话状态集合中删除所有键和值。
Abandon - 删除会话中存储的所有对象。如果未明确调用Abandon方法,则服务器会在会话超时时删除这些对象并销毁会话。
它还引发了Session_End之类的事件。
Session.Clear可以与从书架中删除所有书籍进行比较,而Session.Abandon更像是扔掉整个书架。
你说:
当我测试Session时,当我放弃会话时它没有做任何改变。
当您在一个请求中执行时,这是正确的 在下一个请求中,会话将是不同的。但是session ID can be reused以便id保持不变。
如果您将使用Session.Clear,您将在许多请求中拥有相同的会话。
通常,在大多数情况下,您需要使用Session.Clear 如果您确定用户将要离开您的网站,您可以使用Session.Abandon。
回到差异:
答案 1 :(得分:19)
当您Abandon()
一个会话时,您(或者更确切地说是用户)将获得一个新的SessionId(在下一个请求中)。
当您Clear()
会话时,将删除所有存储的值,但SessionId保持不变。
答案 2 :(得分:8)
这是上面各种回复所涵盖的 sort ,但是我第一次阅读这篇文章时,我错过了一个重要的事实,这导致了我的代码中的一个小错误......
Session.Clear()
将清除所有键的值,但不会导致会话结束事件触发。
Session.Abandon()
不会清除当前请求的值。如果请求另一个页面,则该值将消失。然而,放弃将抛出事件。
那么,在我的情况下(也许在你的情况下?),我需要Clear()
后跟Abandon()
。
答案 3 :(得分:4)
此代码有效并且不会抛出任何异常:
Session.Abandon(); Session["tempKey1"] = "tempValue1";
这是因为当调用Abandon方法时,当前的Session对象排队等待删除但实际上并没有被删除,直到当前页面上的所有脚本命令都被处理完毕。这意味着您可以在与调用Abandon方法相同的页面上访问存储在Session对象中的变量,但不能访问任何后续Web页面。
例如,在以下脚本中,第三行打印值Mary。这是因为在服务器处理完脚本之前,Session对象不会被销毁。
<%
Session.Abandon
Session("MyName") = "Mary"
Reponse.Write(Session("MyName"))
%>
如果在后续网页上访问变量MyName,则为空。这是因为当包含上一个示例的页面完成处理时,MyName被前一个Session对象销毁。
答案 4 :(得分:3)
清除会话会删除存储在那里的值,但您仍然可以在那里添加新值。在销毁会话后,您无法在那里添加新值。
答案 5 :(得分:3)
clear - 从会话状态集合中删除一个或多个值..
放弃 - 从会话中删除或删除会话对象..
答案 6 :(得分:1)
Session.Abandon()
将摧毁/终止整个会话。
Session.Clear()
删除/清除会话数据(即当前会话中的键和值),但会话将处于活动状态。
与Session.Abandon()方法相比,Session.Clear()不会创建新会话,只会使会话中的所有变量都为NULL。
只要浏览器未关闭,会话ID在两种情况下都将保持相同。
Session.RemoveAll()
它从会话状态集合中删除所有键和值。
Session.Remove()
它从会话状态集合中删除一个项目。
Session.RemoveAt()
它从会话状态集合中删除指定索引处的项目。
Session.TimeOut()
此属性指定分配给应用程序的Session对象的超时时间。 (时间以分钟为单位)。
如果用户在超时期限内未刷新或请求页面,则会话结束。
答案 7 :(得分:0)
sessionid的存在可能导致会话固定攻击,这是PCI合规性的一个重点。要删除sessionid并克服会话固定攻击,请阅读此解决方案 - How to avoid the Session fixation vulnerability in ASP.NET?。
答案 8 :(得分:0)
我认为使用Session.Clear()
而不是使用Session.Abandon()
会很方便。
因为稍后调用后会话中的值仍然存在,但在调用前者后会被删除。