在ASP.NET中,何时应该使用Session.Clear()而不是Session.Abandon()?

Lan*_*her 113 .net asp.net session session-state

Session.Clear()和Session.Abandon()都摆脱了会话变量.据我了解,Abandon()结束当前会话,并导致创建一个新会话,从而导致End和Start事件被触发.

在大多数情况下,最好调用Abandon(),例如将用户注销.有没有我使用Clear()的情况?是否存在很大的性能差异?

spl*_*tne 167

Session.Abandon() 销毁会话并触发Session_OnEnd事件.

Session.Clear()只需从Object中删除所有值(内容).具有相同密钥的会话仍然存在.

因此,如果您使用Session.Abandon(),则会丢失该特定会话,并且用户将获得新的会话密钥.例如,当用户注销时,您可以使用它.

使用Session.Clear(),如果你想要用户在同一个会话中剩余的(如果你不希望用户重新登录,例如)和重置所有会话特定数据.

  • @Bibhu:他怎么建议RemoveAll()比Clear()更好?我在他的回答中看到的是RemoveAll()调用Clear(),并且在功能上看起来相同. (3认同)

sha*_*irh 13

只有在用户注销时才使用Session.Clear()可能会造成安全漏洞.因为就Web服务器而言,会话仍然有效.然后嗅探并抓住会话ID并劫持该会话是一个相当微不足道的事情.

出于这个原因,当用户登出时,使用Session.Abandon()会更安全,更明智,因此会话被破坏,并且创建了一个新会话(即使注销UI页面是新会话的一部分,新会话中没有任何用户详细信息,并且劫持新会话将等同于拥有一个新会话,因此它将是静音).

  • 劫持空话会有什么意义?劫持者仍然必须登录,并且他们没有意外提供给新用户的数据. (4认同)

小智 5

我真不知道一个真实的例子是什么,你会使用Session.Abondon(),Session.Clear().

我能理解......如果用户点击您的注销链接并将它们带到"您已经注销"页面....他们的浏览器会话仍在继续,但您想要删除会话中存储的信息.如果您放弃了会话,那么将立即为"您已经注销"页面创建一个新会话.

  • 减1:这不是答案,它是"我也是"! (2认同)