4

我总是将用户的数据(在他们登录后)存储在 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;
    }
}

全球.asax

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

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

更新完整性 这篇文章会做类似上面的事情,但是对于多个用户? 如何从 ASP.NET 中的任何类访问会话变量?

4

6 回答 6

8

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

于 2012-10-23T06:18:33.393 回答
8

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

 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;

它也是类型安全的。

于 2012-10-23T07:44:34.850 回答
3

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

于 2012-10-23T06:19:38.590 回答
1

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

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

于 2012-10-23T06:20:47.543 回答
0

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

编辑:

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

于 2012-10-23T06:19:27.297 回答
0

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

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

坚持会议。

于 2012-10-23T06:22:10.460 回答