通过SessionID和用户名来保证同一个用户不能同时登录
来源:互联网 发布:linux select 返回值 编辑:程序博客网 时间:2024/06/05 07:29
可以通过SessionID和用户名来保证同一个用户不能同时登录的问题,下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录,如果登录。则踢掉以前登录的用户。
1.通过Application全局变量来存储SessionID和用户名,每次登录时都保存,并且将该Application存入 Hashtable中,当用户登录成功后,首先判断该用户是否已经存储在Application中,如果存在(说明已经登录),则将该用户对应的值设置为 XX(值为无用).
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
protected void loginbtn_Click(object sender, EventArgs e)
{
//登录成功。。。。。。。
Hashtable hOnline = (Hashtable)Application["Online"];//读取全局变量
if (hOnline != null)
{
IDictionaryEnumerator idE = hOnline.GetEnumerator();
string strKey = "";
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(UserID))//如果当前用户已经登录,
{
//already login
strKey = idE.Key.ToString();
hOnline[strKey] = "XX";//将当前用户已经在全局变量中的值设置为XX
break;
}
}
}
else
{
hOnline = new Hashtable();
}
hOnline[Session.SessionID] = UserID;//初始化当前用户的
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Redirect("main.aspx");
}
2,写一个BasePage加一个Init方法如下,系统的所有页面均继承自该BasePage
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
protected override void OnInit(EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];//获取已经存储的application值
if(hOnline != null)
{
IDictionaryEnumerator idE = hOnline.GetEnumerator();
while(idE.MoveNext())
{
if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
{
//already login
if (idE.Value != null && "XX".Equals(idE.Value.ToString()))//说明在别处登录
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Write("<
script
>alert('你的帐号已在别处登陆,你被强迫下线!');top.location.href='Default.aspx';window.close();</
script
>");//退出当前到登录页面
// Response.Redirect("Default.aspx");
Response.End();
// return false;
}
//break;
}
}
}
3.在程序退出后从Application中清除当前SessionID
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline[Session.SessionID] != null)
{
hOnline.Remove(Session.SessionID);//清除当前SessionID
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}
}
4.如果程序非正常退出,SessionID没有及时的清除,那么也不会影响帐号的正常登录,而SessionID也会随着Session的过期而自动清除,服务器也不会有压力。
5,如果感觉存储在Application中感觉不好,也可以将SessionID存入数据库中,判断方法和上面一样。
6,测试时注意在不同机器上面测试,同一台机子上面的SessionID是一样的,每次设置为XX后又有新值进去,看不到效果,如果要防止同一个帐号在同一台机子上面同事登录两次以上,可以通过mac地址来判断。
- 通过SessionID和用户名来保证同一个用户不能同时登录
- 通过SessionID和用户名来保证同一个用户不能同时登录
- WebRequest和WebBrowser同时登陆,使用同一个sessionID
- 如何保证同一个账号同时只能在一个设备登录,账号自动登录
- Volley获取和发送sessionid保持用户登录状态
- php同时使用session和cookie来保存用户登录信息
- php同时使用session和cookie来保存用户登录信息
- php同时使用session和cookie来保存用户登录信息
- php同时使用session和cookie来保存用户登录信息
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Asp.net中实现同一用户名不能同时登录(单点登录)
- fsocketopen操作传送sessionId和用户名密码
- 一种实现一个用户帐户不能同时登录的问题
- springsecurity中如何做到多个用户不能使用同一个账号同时登陆系统
- log4net 配置文件配置方法
- 二分查找
- C# 实现获取无线网络RSSI、SSID、BSSID
- 实习小记
- iOS: NSString的方法fileSystemRepresentation
- 通过SessionID和用户名来保证同一个用户不能同时登录
- 设计模式——装饰者模式(Decorator)
- hdu 1049
- hdu4405(概率DP)
- iOS: NSString的方法getCharacters:range:
- GCC编译
- c语言static关键字
- hdu 1914 The Stable Marriage Problem(延迟认可算法)
- iOS: NSString的方法getCString:maxLength:encoding: