【发布时间】:2012-10-23 06:16:40
【问题描述】:
我一直将用户的数据(在他们登录后)存储在 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?
【问题讨论】:
-
是的,这是一个单用户系统。您是否尝试过与多个用户一起使用它?
-
目前还没有。到目前为止,我只在测试中使用过它。
-
即使使用 Session 也可能是个问题。如果您需要在负载均衡器后面使用多个服务器,则需要确保每个用户请求始终发送到同一台服务器,以便他们始终拥有相同的会话。这可以通过粘性 IP 地址完成,但有缺点; What is the downside to sticky sessions with load balancers?
-
为什么不两全其美。更改您的
Member类以停止使用静态变量,然后只需在Session_Start@Global.asax中创建一个新的Member实例并将其分配给当前会话。 -
@DaveAnderson - 或使用状态服务器或 SQL 服务器会话状态(或者我相信还有其他解决方案也可以跨多个 Web 服务器实现共享会话状态)
标签: c# asp.net class session-variables