我总是在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?
答案 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)
会话是按用户创建的,而生产中的类在整个应用程序的整个生命周期中都是活动的。
虽然您可能不会遇到只有一个用户的开发问题,但在生产环境中,每个请求都会覆盖以前的数据,因此可能会带来安全风险。
坚持会议。