现在有两个用户A和B,我在本机上登录用户A,然后在服务器上也登录用户A,会提示“操作员已登录,不允许再次登录”,然后我退出服务器上的用户A,登录用户B,是可以正常登录的,但是当我再在服务器上退出用户B重新登录用户A时居然也是可以登录进去,这时我本机上的用户A是没有退出的,正常情况下应该是服务器上会提示“操作员已登录,不允许再次登录”
求大神指教,详细代码如下:
1、登录事件中的代码如下:
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline != null && hOnline.Count > 0)
{
IDictionaryEnumerator idE = hOnline.GetEnumerator();
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(M04User.m_UseCode))
{
Response.Write("<Script Language=Javascript><span>alert</span>('操作员已登录,不允许再次登录!');</Script>");
break;
}
else
{
hOnline = new Hashtable();
//记录当前登录用户的sessionid以及value值
hOnline[Session.SessionID] = M04User.m_UseCode;
//修改Application
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Redirect(strStartPage);
}
}
}
else
{
hOnline = new Hashtable();
//记录当前登录用户的sessionid以及value值
hOnline[Session.SessionID] = M04User.m_UseCode;
//修改Application
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Redirect(strStartPage);
}
2、退出按钮事件代码如下:
if (Session["userid"] != null)
{
Session["userid"] = "";
Session.Clear();
Session.Abandon();
Application["user"] = "";
}
Hashtable hOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
if (hOnline[System.Web.HttpContext.Current.Session.SessionID] != null)
{
hOnline.Remove(System.Web.HttpContext.Current.Session.SessionID);
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Online"] = hOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
Response.Redirect("Login.aspx");
3、Global.asax代码如下:
void Session_End(object sender, EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline != null && hOnline[Session.SessionID] != null)
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}
}
我想可能是你退出b用户的那个标识清空了或者不存在了,这个时候可以登录A 是因为重复登录的标识不存在了?是逻辑上的问题?
是的,我打了日志查看了Application["Online"] 里面的值,发现不管登录多少个用户,里面都只有一个值,应该就是注销的时候,是注销了所有的用户,而不仅仅只是当前登录用户。
这个暂时没有想到解决方法,我换了个思路,把登录状态存到数据表中来处理。
但是这个问题应该怎么解决呢?注销的时候我也是根据Session.SessionID来注销的呀
@周大大: 用户多吗?如果用户多的话 就不建议都存在一个数组里面 或者一个变量里面,可以在校验账号密码时候直接校验一下是否在线?和账号密码校验一起操作?我是前端工程师,只可以给你逻辑上的建议啦
@周大大:登录的时候添加一个字段是true或者false,这样判断呢?
@文博的博客: 登录状态应该放在服务器上,登录时再到服务器去校对,而不是在本地啊
@世宝: 是的啊放在服务器,验证用户名密码时候一起验证了不对吗?账号密码不是存在服务里面的吗
@文博的博客: 你这种加字段的方法,如果登陆人非正常退出就不行了