会话存储与类存储

时间:2012-10-23 06:16:40

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

我总是在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?

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:8)

我发现这种方法是最容易使用且机会最少的错误之一。我认为这称为Facade Design Pattern。

 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;

它也是类型安全的。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

会话旨在处理帖子后面的应用程序状态,这是会话的唯一目的,即维护应用程序状态,它是您需求的理想选择。

答案 4 :(得分:0)

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

修改

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

答案 5 :(得分:0)

会话是按用户创建的,而生产中的类在整个应用程序的整个生命周期中都是活动的。

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

坚持会议。