C# 会话存储与类存储
我总是将用户(登录后)的数据存储在会话变量中,因此我可以在任何页面上使用该数据。C# 会话存储与类存储,c#,asp.net,class,session-variables,C#,Asp.net,Class,Session Variables,我总是将用户(登录后)的数据存储在会话变量中,因此我可以在任何页面上使用该数据。 我发现另一种全局存储信息的方法是将信息存储在类中,使用{get;set;},然后从任何页面调用它 现在,我使用了这两种方法作为测试,它们都非常有效: Session[“LoginId”]=rdr[“uniqueIdentifier”].ToString() 及 Member.LoginId=rdr[“uniqueIdentifier”].ToString() 其中(在Member.cs中) Global.asax
我发现另一种全局存储信息的方法是将信息存储在类中,使用
{get;set;}
,然后从任何页面调用它
现在,我使用了这两种方法作为测试,它们都非常有效:
Session[“LoginId”]=rdr[“uniqueIdentifier”].ToString()代码>
及
Member.LoginId=rdr[“uniqueIdentifier”].ToString()代码>
其中(在Member.cs中)
Global.asax
void Session_End(object sender, EventArgs e)
{
Member.ClearVariables();
}
我的问题是,在这样的类中存储用户数据是否足够安全,还是应该坚持使用Session
对象
更新完整性
这篇文章会像上面那样做吗,但对多个用户来说?
在您的情况下,这是不安全的,因为asp.net中的静态变量对所有用户都是通用的。第二种方法的缺点是,当应用程序重新启动时,变量将丢失其值。但通过会话,您的数据将存储在浏览器cookie中
编辑:
只有在需要应用程序级公共共享(在所有用户之间)变量时才使用静态变量。使用静态变量是不安全的。为一个用户设置的值将覆盖另一个用户的值。
静态变量意味着只创建一个变量并用于所有会话。
静态变量的生命周期就是应用程序的生命周期。
如果您的变量是特定于用户的(看起来是),那么您需要坚持使用会话变量。我确信它不适合您。类的实例仅在处理请求时存在。处理请求后,您将无法再次获取该类的实例。对于静态变量,它是应用程序范围的,不适合存储用户特定的信息
会话设计用于在回发过程中处理应用程序的状态,它是会话的唯一目的,即维护应用程序的状态,非常适合您的要求。会话是根据每个用户创建的,而类在生产过程中在应用程序的整个生命周期中都是活动的
虽然您可能不会在仅使用一个用户的开发过程中遇到问题,但在生产过程中,每个请求都会覆盖以前的数据,因此可能会带来安全风险
坚持使用会话。我发现这种方法是最容易使用的方法之一,而且错误几率最小。我认为这就是所谓的立面设计模式
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;
它也是类型安全的。因此,用外行术语来说,任何在前一个用户之后登录的用户都会销毁前一个用户的数据,并将其替换为自己的数据?是的,这是一个单用户系统。您是否尝试与多个用户一起使用它?目前还没有。到目前为止,我只在测试中使用过这个方法。即使使用会话也可能是一个问题。如果您需要在负载平衡器后面使用多个服务器,则需要确保每个用户请求始终转到同一服务器,以便它们始终具有相同的会话。这可以通过粘性IP地址实现,但有回退;为什么不两全其美呢。更改成员
类以停止使用静态变量,然后在会话中创建一个新的成员
实例_Start@Global.asax
并将其分配给当前会话。@DaveAnderson-或使用状态服务器或SQL server会话状态(或者我相信还有其他解决方案也可以跨多个web服务器实现共享会话状态)谢谢。快速回复总是很受欢迎的:在我把事情搞砸之前,你能在aspx.cs页面上给出使用它的代码吗?as TraccrSession
来自哪里?现在检查一下,实际上Traccr是我的项目名称,在给你之前,我试着到处替换它。如果你仍然在代码中找到它st将其更改为SiteSession。我保留了会话。放弃和会话。在我的注销按钮上清除,这似乎可以清除所有内容。我的理论是,它会破坏存储用户梦想的会话。哈哈,我仍然在尝试;因此,阅读本文的任何其他人都会知道,如果会话存储在proc中,那么会发生什么n应用程序重新启动是否会导致会话丢失?
int userId= SiteSession.Current.UserID;