限制用户登录 / 判断用户在线的问题
最近搞个限制多个用户登录的问题,本以为很简单,结果想了很久都没弄出来,在网上也不曾找到答案;后来终于找到了解决的办法,觉得不错,特拿来分享。
解决这个问题有多种方法,思路一是做成长连接形式的,这个思路有多种实现方法,我见过的如服务器推,实现起来挺困难的,我看过相关的一下资料,没有深入研究。
思路二是存数据库,这个方法比较容易想,网上也有。思路就是 ajax 定时刷新,比如隔 1 分钟向数据库插入当前在线时间,自然 user 表里面有个记录当前时间的字段,登录的时候取出字段的值和当前时间比较,超过一分钟就说明下线了,我开始想到的就是这种。很显然这个弊端很大,定时插入数据库有损系统性能,具体代码就不写了。
思路三是存内存,实现方法和思路二差不多,不同的是它存的是内存,本质上没有改变什么,还是要 ajax 定时刷新,区别是给数据库减轻了压力,下面简要的说下方法。
1. 建一个类,定义一个静态集合,用来存放用户名和当前在线时间;
public class UserOnline
{
private static Dictionary <int , string > onlineuserlist = null ;
public static Dictionary <int , string > GetOnlineUser()
{
if (onlineuserlist == null )
{
onlineuserlist = new Dictionary <int , string >();
}
return onlineuserlist;
}
}
2.ajax 定时刷新;
[AjaxPro.AjaxMethod ]
public int SetOnlieTime()
{
int flag = 0;
try
{
Dictionary <int , string > userlist = UserOnline .GetOnlineUser();
if (userlist.ContainsKey(Convert .ToInt32(Session["userid" ].ToString().Trim())))
{
userlist[Convert .ToInt32(Session["userid" ].ToString().Trim())] = DateTime .Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss" );
}
else
{
userlist.Add(Convert .ToInt32(Session["userid" ].ToString().Trim()), DateTime .Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss" ));
}
flag = 1;
}
catch { }
return flag;
}
3.js 调用上面的 ajax 方法;
function updatetime()
{
if (Frameclsss_class1_left.SetOnlieTime().value==1)
{
window.setTimeout("updatetime()" ,60000);
}
else
{
alert(' 服務器斷開連接,請檢查你的網絡再訪問!' );
window.parent.location.href='../../Default.aspx' ;
}
}
< body onload =" updatetime();">
4. 登录时先判断用户名和密码,然后判断时间;
if (myReader.Read())
{
Dictionary <int , string > userlist = UserOnline .GetOnlineUser();
bool timeflag = false ;
if (userlist.ContainsKey(Convert .ToInt32(userid)))
{
timeflag = DateTime .Now.ToString("yyyy-MM-dd HH:mm:ss" ).CompareTo(Convert .ToDateTime(userlist[Convert .ToInt32(userid)]).ToString("yyyy-MM-dd HH:mm:ss" )) < 0 ? true : false ;
} ……
思路四就是用 session 、 application 等,个人觉得用不好,自个试试就知道了。
结束语:这里主要推荐的是第三种方法。觉得存内存这个想法好,很多需要支持大量查询的表,我们都可以建立内存表,直接从内存中读取,想必速度是要快很多的(本文仅供参考,如有误导,还望见谅) .