标题:asp.net关于同一时间只能一个人登录的问题
只看楼主
songgaotong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-8-26
结帖率:100%
已结贴  问题点数:0 回复次数:7 
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
筱晓绾
Rank: 10Rank: 10Rank: 10
来 自:湖南
等 级:贵宾
威 望:12
帖 子:512
专家分:1736
注 册:2010-9-1
得分:0 
这是你写的么?哪里出错了?程序运行时有什么问题?
2010-12-22 17:06
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2545
专家分:9359
注 册:2007-11-3
得分:0 
这个方法俺没用过 可以考虑做监听
另外还有一种方法 LZ可以试试 用cache实现单点登录
把用户的登录信息保存在Cache中,设置过期时间为Session失效的时间,一旦Session失效,Cache也过期
程序代码:
string sKey = username.Text.ToString().Trim(); // 得到Cache中的给定Key的值  
string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在  
if (sUser == null || sUser == String.Empty)  
{  
        TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);//取得Session的过期时间  
        HttpContext.Current.Cache.Insert(sKey, sKey, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);//将值放入cache己方便单点登录  
         //成功登录  
}  
else if (Cache[sKey].ToString() == sKey)//如果这个账号已经登录  
{  
         ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('对不起,当前用户已经登录');</script>");  
         return;  
}  
else 
{  
         Session.Abandon();//这段主要是为了避免不必要的错误导致不能登录  
} 

程序代码:
protected void login_btnUserLogin_Click(object sender, EventArgs e)  
{  
    Model.userInfo.User modelUserLogin = new Model.userInfo.User();  
    modelUserLogin.UserName = login_txtUserName.Text.Trim();//把用户名存储到Model  
    modelUserLogin.Pwd = login_txtUserPwd.Text.Trim();//把用户密码存储到Model  
    BLL.userInfo.User bllUserLogin = new BLL.userInfo.User();  

 
    string[] session_str = new string[2];  

    session_str = bllUserLogin.get_loginZT(modelUserLogin.UserName, modelUserLogin.Pwd);//调用后台sql语句判断是否登陆成功,不成功返回null  
 
    if (session_str[0] != null)//判断登陆是否成功  
    {  
        if (Session["sessionUserName"] == null || Session["sessionUserName"] == string.Empty)//判断sessionUserName的session是否为null,为null说明这个用户当前没有登陆,可以正常登陆  
        {  
            Session["sessionUserName"] = modelUserLogin.UserName;  
            Session["sessionGLBM"] = session_str[1];  

 
            Response.Write("<script language:javascript>javascript:window.alert('登陆成功!');</script>");  
                FormsAuthentication.RedirectFromLoginPage(modelUserLogin.UserName, false);  
            this.Response.Redirect("../private/index/MenuIndex.aspx");  
        }  
        if (Session["sessionUserName"].ToString().Equals(login_txtUserName.Text.Trim()))//判断sessionUserName的session的值是否与前台输入的用户名是否相同,如果相同,则说明这个用户当前正在登陆,弹出警告不允许登陆  
        {  
            Response.Write("<script language:javascript>javascript:window.alert('用户已登陆!');</script>");  
            return;  
        }  
    }  
    else 
    {  
        Response.Write("<script language:javascript>javascript:window.alert('用户名或密码错误!');</script>");  
    }  
} 



web.Config下的<system.web>标签下先设置窗体验证
程序代码:
<authentication mode="Forms">//mode值是Forms为定义成窗体验证  
    <forms loginUrl="public/Login.aspx" name=".ASPXAUTH">//用户未登陆就先访问public/Login.aspx页面  
</forms> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 







[ 本帖最后由 wangnannan 于 2010-12-23 08:29 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-12-23 08:28
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
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2545
专家分:9359
注 册:2007-11-3
得分:20 
不过今天经理说能不能换个方法,我登录不让别人登陆
....
...当头儿的都认为...什么都简单...孰不知要改多少代码....

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-12-23 14:28
cccool
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:268
专家分:555
注 册:2007-5-1
得分:0 
是不是可以考虑在登录和登出的时候向数据库写入本地ip和登录时间,登录的时候和页面刷新时再验证一下:同一个ip就不管了,不同ip就根据登录时间来判断

[fly]让心情飞一会[/fly]
">Email to Me     
2010-12-23 14:40
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.080830 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved