标题:asp.net关于同一时间只能一个人登录的问题
取消只看楼主
songgaotong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-8-26
结帖率:100%
已结贴  问题点数:0 回复次数:3 
asp.net关于同一时间只能一个人登录的问题
我想做个同一时间只能一个人登录,如果我现在正在登录,别人登录了就会把我踢下来,类似QQ的登陆,我在网上找了个,照着做了下,发现不能实现,我不知道是不是要在  void Application_Start(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] = "XXXXXX";
break;
}
}
}
else
{
hOnline = new Hashtable();
}

hOnline[Session.SessionID] = UserID;
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();

用户登陆的时候将登陆用户名放在一个全局变量Online,Online为Hashtable结构,Key为SessionID,Value为用户名。每次用户登陆时均判断以下要登陆的用户名在Online中是不是已经存在,如果存在
该用户名已经被登陆,将第一个人登陆的SessionID对应的用户名强制变更为XXXXXX,表示该登陆将被强制注销。

建立一个CommonPage类 放到 app_code中,系统中所有的页面都继承于CommonPage类,在CommonPage类的后台代码中添加如下代码:

override protected void OnInit(EventArgs e)
{

Hashtable hOnline = (Hashtable)Application["Online"];
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 && "XXXXXX".Equals(idE.Value.ToString()))
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
MessageBox("你的帐号已在别处登陆,你被强迫下线!",Login.aspx);
return false;
}
break;
}
}
}

}

继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到
Login画面。

最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

Hashtable hOnline = (Hashtable)Application["Online"];
if(hOnline[Session.SessionID] != null)
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}

如果用户不正常退出后重登陆,因为重登陆的优先级大,不会影响用户的登陆,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。
搜索更多相关主题的帖子: asp 时间 登录 
2010-12-22 15:48
songgaotong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-8-26
得分:0 

我最先用的就是这种方法,我在页面上放了个Timer来记时间 我给session设置时间为5分钟,我在登陆的时候,这5分钟内别人不能登录,5分钟后别人又可以登录了,我又把设置为99999分钟,oK,我直接擦掉网页的话,永远也上不去了,也许得99999分钟之后吧!所以这方法我就放弃了,估计是我太菜,不会整,没整好!不知道别人是怎么弄的,

至于我上面的方法是,从网上找的,昨天搞了一下午,后来打了个断点,发现也就是个别地方代码有点问题,所以没实现,我改了下,今天可以实现了,感觉挺好用!因为后登录的优先级高,所以直接关闭网页(非法的)也没事,不过今天经理说能不能换个方法,我登录不让别人登陆,我开始想更简单了啊,不让他强制修改用户名了,直接不让登录,但是优先级又给反过来了,一旦非法关闭网页就成问题了!短时间又登不上去了!
2010-12-23 14:16
songgaotong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-8-26
得分:0 
其实我觉得登录的这个问题,最主要的是要解决断电,直接关闭网页的情况,因为没人老老实实的点那个注销按钮,因为我自己从来都没点过,指望客户老老实实去点,门都没有,所以只要解决直接关闭网页的问题就行了!哎,这软件杂到我手中就这么费劲呢,难道真是因为我太笨?
2010-12-23 14:23
songgaotong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-8-26
得分:0 
改代码我不怕,麻烦我不怕,怕的是我搞不出来,纠结
2010-12-23 15:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-329609-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064209 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved