您的位置:首页 > 其它

限制用户登录/判断用户在线的问题

2011-01-24 11:05 190 查看
限制用户登录

/

判断用户在线的问题


最近搞个限制多个用户登录的问题,本以为很简单,结果想了很久都没弄出来,在网上也不曾找到答案;后来终于找到了解决的办法,觉得不错,特拿来分享。

解决这个问题有多种方法,思路一是做成长连接形式的,这个思路有多种实现方法,我见过的如服务器推,实现起来挺困难的,我看过相关的一下资料,没有深入研究。

思路二是存数据库,这个方法比较容易想,网上也有。思路就是
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
等,个人觉得用不好,自个试试就知道了。

结束语:这里主要推荐的是第三种方法。觉得存内存这个想法好,很多需要支持大量查询的表,我们都可以建立内存表,直接从内存中读取,想必速度是要快很多的(本文仅供参考,如有误导,还望见谅)
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐