多点登陆限制,禁止用户多点在线
概念
禁止用户多点在线,不同于单点登陆
- 禁止用户多点在线,即当用户已在线时,该用户其他地点登陆,该用户被挤下线。
- 单点登陆,指用户只用登陆一个站点,其他站点默认登陆。
知识点
知识点1:不同的浏览器访问站点,代表不同的会话,有不同的SessionID,存在于浏览器的Cookie上和服务器上。
知识点2:.NET中有一个全局文件Global.asax中,Session_End函数是在Session结束时做处理。注:结束时指Session注销,也指过期,自动进入Session_End函数。
<sessionState mode="InProc" timeout="1"></sessionState>
//说明:<sessionState>是<system.web>的子元素,其中timeout属性表示Session的过期时间,单位是分钟,上面的意思是用户一分钟在页面无任何操作则Session失效
以上可以快速进入Session_End函数
知识点3:Web应用的生命周期是这样的:Application_Start -> Session_Start -> Session_End -> Application_End
思路
此后,每个页面都判断一次key为该sessionId的值是否为"XXX"或者空,满足条件就跳转到登陆页。
拓展:key是sessionId,value是userName 的全局对象可以存文件中,数据库中亦可。
代码
//Global.asax 会话
protected void Session_End(object sender, EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline[Session.SessionID] != null)
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}
}
//MasterPage.Master.cs
protected void Page_Load(object sender, EventArgs e)
{
Hashtable hashTable = (Hashtable)Application["Online"];
if (!hashTable.ContainsKey(Session.SessionID) || hashTable[Session.SessionID] == "XXX")
{
Response.Redirect("~/Login.aspx");
}
}
//Login.aspx
protected void Button1_Click(object sender, EventArgs e)
{
Hashtable hsTable = (Hashtable)Application["Online"];
string strUserName = txtBox.Text;
string strKey = "";
//判断全局对象中是否有此用户
foreach (string key in hsTable.Keys)
{
if (hsTable[key].ToString() == strUserName)
{
strKey = key;
}
}
if (strKey != "")
{
hsTable[strKey] = "XXX";
}
hsTable.Add(Session.SessionID, strUserName);
Response.Redirect("~/HomePage.aspx");
}