2012-10-23 151 views
4

我一直在会话变量中为用户(登录后)存储数据,因此我可以在任何页面上使用该数据。
我发现另一种方式在全球范围内存储的信息,将其存储在一个类中,使用{ get; set;},然后调用从任何页面。会话存储vs类存储

现在,我已经使用这两种方法的测试,他们都工作得很好:

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

而且

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

如果(在会员。 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?

+0

是的,这是一个单用户系统。您是否尝试将其与多个用户一起使用? –

+0

还没有。我只在测试中使用过这个。 – TheGeekZn

+2

即使使用Session也是一个问题。如果您需要在负载均衡器后面使用多个服务器,则需要确保每个用户请求始终都转到同一台服务器上,以便它们始终具有相同的会话。这可以通过粘性IP地址来完成,但会缩短; [负载平衡器的粘性会话有什么不利之处?](http://serverfault.com/questions/46307/what-is-the-downside-to-sticky-sessions-with-load-balancers) –

回答

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 

} 

值可以在会话店这样的:

SiteSession.Current.UserType = user.UserType; 

,并且可以得到这样的:

int userId= SiteSession.Current.UserID; 

它是类型安全的。

+0

在我继续前进一个混乱的东西,你可能会给代码使用它在aspx.cs页面? – TheGeekZn

+0

刚编辑我的答案。 –

+0

'as as TraccrSession'从哪里来? – TheGeekZn

8

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

+1

谢谢。快速响应总是赞赏:D – TheGeekZn

0

缺点关第二种方法是当应用程序重新启动变量将失去他们的values.but与您的数据将被存储在浏览器cookie会话。

编辑:

只有当你需要一个通用应用程序级别使用静态变量 - 共享(所有用户之间)的变量。

+0

如果会话存储在proc中会怎么样?那么应用程序重新启动会导致会话丢失? – Ngm

3

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

+0

那么,从外行的角度来看,任何在之前登录的用户都会破坏以前的用户数据并将其替换为自己的用户数据? – TheGeekZn

+0

是的,这是正确的 – Ngm

1

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

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

0

会话的每个用户创建的,而班,在生产,在整个应用程序的整个生命周期活着。

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

坚持会话。