【问题标题】:In ASP.NET, when should I use Session.Clear() rather than Session.Abandon()?在 ASP.NET 中,何时应该使用 Session.Clear() 而不是 Session.Abandon()?
【发布时间】:2010-09-25 17:33:51
【问题描述】:

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

在大多数情况下调用 Abandon() 似乎更可取,例如注销用户。有没有我会使用 Clear() 的场景?性能差异大吗?

【问题讨论】:

    标签: asp.net .net session session-state


    【解决方案1】:

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

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

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

    如果您希望用户留在同一会话中(例如,如果您不希望用户重新登录)并重置所有会话特定数据,请使用 Session.Clear()

    【讨论】:

    • 我认为最好使用 RemoveAll() 而不是 Clear(),正如“Darin Dimitrov”在这里所建议的 stackoverflow.com/a/3931344/713246
    • @Bibhu:他如何建议 RemoveAll() 比 Clear() 更好?我在他的回答中看到的只是 RemoveAll() 调用了 Clear(),并且在功能上似乎是相同的。
    • 刚刚使用 Session.Abandon() 作为使用 Windows 身份验证的内部应用程序的“注销” - 用户不必重新进行身份验证(Chrome,FF),但会话已被处理并发布了一个新的,符合我的要求
    【解决方案2】:

    仅在用户注销时使用 Session.Clear() 可能会造成安全漏洞。就 Web 服务器而言,会话仍然有效。然后,嗅探、获取会话 ID 并劫持该会话是一件相当简单的事情。

    因此,在注销用户时,使用 Session.Abandon() 会更安全、更明智,这样会销毁会话并创建新会话(即使注销 UI 页面是新会话,新会话中不会包含任何用户详细信息,并且劫持新会话将相当于拥有一个新会话,因此它将是静音的)。

    【讨论】:

    • 劫持空会话有什么意义?劫机者仍然需要登录,并且他们没有数据可以意外地提供给新用户。
    【解决方案3】:

    Session.Abandon 如上所述破坏会话,因此您应该在注销某人时使用它。我认为Session.Clear 的一个很好的用途是用于电子商务网站上的购物篮。这样一来,购物篮就可以在不注销用户的情况下被清除。

    【讨论】:

    • 但是如果我使用Session.Abandon 来清除特定的购物篮呢?
    【解决方案4】:

    我遇到了这个问题并尝试了这两种方法,但不得不解决像“pageEditState”这样的废话,但不删除用户信息,以免我不得不再次查找它。

    public static void RemoveEverythingButUserInfo()
    {
        foreach (String o in HttpContext.Current.Session.Keys)
        {
            if (o != "UserInfoIDontWantToAskForAgain")
                keys.Add(o);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-02-11
      • 2020-02-26
      • 1970-01-01
      相关资源
      最近更新 更多