【问题标题】:Session Storage vs Class Storage会话存储与类存储
【发布时间】:2012-10-23 06:16:40
【问题描述】:

我一直将用户的数据(在他们登录后)存储在 Session 变量中,因此我可以在任何页面上使用该数据。
我发现另一种全局存储信息的方法是将其存储在一个类中,使用{ get; set;},然后从任何页面调用它。

现在,我已经使用这两种方法作为测试,它们都非常有效:

Session["LoginId"] = rdr["uniqueIdentifier"].ToString();

Member.LoginId = rdr["uniqueIdentifier"].ToString();

在哪里(在 Member.cs 中)

public class Member
{
    public static int Challenges { get; set; }
    public static int NicknameId { get; set; }
    public static string LoginId { get; set; }
    public static string FriendsListId { get; set; }

    public static void ClearVariables()
    {
        Challenges = 0;
        NicknameId = 0;
        LoginId = null;
        FriendsListId = null;
    }
}

Global.asax

void Session_End(object sender, EventArgs e) 
    {
        Member.ClearVariables();
    }

我的问题是,在这样的类中存储用户数据是否足够安全,还是应该坚持使用 Session 对象?

为了完整性而更新 这篇文章会做类似上面的事情,但针对多个用户吗? How to access session variables from any class in ASP.NET?

【问题讨论】:

  • 是的,这是一个单用户系统。您是否尝试过与多个用户一起使用它?
  • 目前还没有。到目前为止,我只在测试中使用过它。
  • 即使使用 Session 也可能是个问题。如果您需要在负载均衡器后面使用多个服务器,则需要确保每个用户请求始终发送到同一台服务器,以便他们始终拥有相同的会话。这可以通过粘性 IP 地址完成,但有缺点; What is the downside to sticky sessions with load balancers?
  • 为什么不两全其美。更改您的 Member 类以停止使用静态变量,然后只需在 Session_Start@Global.asax 中创建一个新的 Member 实例并将其分配给当前会话。
  • @DaveAnderson - 或使用状态服务器或 SQL 服务器会话状态(或者我相信还有其他解决方案也可以跨多个 Web 服务器实现共享会话状态)

标签: c# asp.net class session-variables


【解决方案1】:

我发现这种方法是最容易使用且错误率最低的方法之一。我认为这被称为外观设计模式。

 public class SiteSession
{
    #region Attributes
    private static string _siteSession = "__SiteSession__";
    #endregion

    #region Constructor
    private SiteSession()
    {
    }
    #endregion

    #region CurrentSession
    public static SiteSession Current
    {
        get
        {
            SiteSession session = HttpContext.Current.Session[_siteSession ] as    SiteSession;
            if (session == null)
            {
                session = new SiteSession();
                HttpContext.Current.Session[_siteSession ] = session;
            }
            return session;
        }
    }
    #endregion

    #region SessionProperties
    public sherserve.CustomTypes.UserTypes UserType { get; set; }
    public int UserID { get; set; }
    public String StaffID { get; set; }
    public String Position { get; set; }
    public String StaffName { get; set; }
    public int TimeZone { get; set; }

    public String DealerId { get; set; }
    public String DealerPosition { get; set; }
    public String DealerName { get; set; }
    public int DealerFirmId { get; set; }

    public String ClientId { get; set; }
    public String ClientName { get; set; }
    public String ClientBusiness { get; set; }
    public String CountryCode { get; set; }
    public int ClientFirmId { get; set; }
    #endregion

}

值可以像这样存储在 Session 中:

 SiteSession.Current.UserType = user.UserType;

并且可以像这样获得:

int userId=    SiteSession.Current.UserID;

它也是类型安全的。

【讨论】:

  • 在我把事情搞砸之前,你能不能给代码在aspx.cs页面上使用它?
  • as TraccrSession 来自哪里?
  • 现在检查,实际上 Traccr 是我的项目名称,在给你之前我试图到处替换它。如果您仍然在代码中找到它,只需将其更改为 SiteSession。
  • 我在注销按钮上保留了Session.AbandonSession.Clear,这似乎清除了一切。我的理论是它破坏了存储用户变量的会话。
  • 哈哈好吧我还是试过了;所以任何读这篇文章的人都会知道xD
【解决方案2】:

在您的情况下,这根本不安全,因为 asp.net 中的静态变量对所有用户都是通用的。

【讨论】:

  • 谢谢。快速响应总是受欢迎的:D
【解决方案3】:

使用静态变量并不安全。为一个用户设置的值会覆盖另一个用户的值。
静态变量意味着只有一个变量被创建并用于所有会话。 静态变量的生命周期就是应用生命周期。
如果您的变量是特定于用户的(看起来是),您将需要坚持使用 Session 变量。

【讨论】:

  • 所以用外行的话来说——任何在前一个用户之后登录的用户都会破坏之前用户的数据并用他们自己的数据替换?
【解决方案4】:

我确信它不适合你。类的实例仅在请求被处理时才存在。处理请求后,您将无法再次获取该类的实例。在静态变量的情况下,它是应用程序范围的,不适合存储用户特定的信息。

Session 旨在通过回发处理应用程序的状态,它是会话的唯一目的,即维护应用程序的状态,它非常适合您的要求。

【讨论】:

    【解决方案5】:

    第二种方法的缺点是,当应用程序重新启动时,变量将丢失它们的值。但是通过会话,您的数据将存储在浏览器 cookie 中。

    编辑:

    仅当您需要应用程序级别的公共(所有用户之间)共享变量时才使用静态变量。

    【讨论】:

    • 如果会话存储在进程中怎么办?那么应用重启会导致会话丢失?
    【解决方案6】:

    会话是为每个用户创建的,而生产中的类在应用程序的整个生命周期中都是有效的。

    虽然您可能不会在只有一个用户的开发过程中遇到问题,但在生产环境中,每个请求都会覆盖以前的数据,因此可能会带来安全风险。

    坚持会议。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      相关资源
      最近更新 更多