注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 Cisco IOS下载
 帮助

Asp.net中禁止用户多次登录


2007-12-07 13:33:12
 标签:c# 用户 Asp.net   [推送到技术圈]

判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用唯一的一个对象):
以下是引用片段:
  string strUserId = txtUser.Text;
  ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
  if (list == null)
  {
  list = new ArrayList();
  }
  for (int i = 0; i < list.Count; i++)
  {
  if (strUserId == (list[i] as string))
  {
  //已经登录了,提示错误信息
  lblError.Text = "此用户已经登录";
  return;
  }
  }
  list.Add(strUserId);
  Application.Add("GLOBAL_USER_LIST", list);
 
 当然这里使用Cache等保存也可以。
  接下来就是要在用户退出的时候将此用户从Application中去除,我们可以在Global.asax的Session_End事件中处理:
以下是引用片段:
  void Session_End(object sender, EventArgs e)
  {
  // 在会话结束时运行的代码。
  // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
  // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
  // 或 SQLServer,则不会引发该事件。
  string strUserId = Session["SESSION_USER"] as string;
  ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
  if (strUserId != null && list != null)
  {
  list.Remove(strUserId);
  Application.Add("GLOBAL_USER_LIST", list);
  }
  }
  这些都没有问题,有问题的就是当用户直接点浏览器右上角的关闭按钮时就有问题了。因为直接关闭的话,并不会立即触发Session过期事件,也就是关闭浏览器后再来登录就登不进去了。
  这里有两种处理方式:
  1、使用JavaScript方式
  在每一个页面中加入一段javascript代码:
以下是引用片段:
  function window.onbeforeunload()
  {
  if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){
  window.open("logout.ASPx");
  }
  }




    文章评论
 
2007-12-09 19:50:00
用户登陆后添加到在Application中, 再次登陆时在Application中判断是否已经登陆,退出后再从Application中删除,这样未免太麻烦了吧.
我认为只用Session就可以完成了.登陆时判断Session["SESSION_USER"] 是否已经存在,如果不存在就创建之,如果存在就提示已经登陆的信息.这样即节省了资源,实现起来也方便.
纯属个人观点,有不对的地方请前辈多多指教.

2007-12-10 10:20:32
Application与session的区别是存储单用户信息和所有用户的信息,加入用户A登陆后Session["SESSION_USER"] 记录,则Session["SESSION_USER"] 不为空,其它用户B登陆后,如果通过判断Session["SESSION_USER"] 是否有值,那么其他任何用户都不可能在登陆成功了!!总不能在程序中判断Session["SESSION_USER"] 是否等于某个具体的用户名吧?所以如果按你说的通过判断Session["SESSION_USER"] 是否有值的话,在程序里要根据每个用户名进行判断。。。。。。你觉得科学与显示吗?还有就是我这里是防止同一帐号多次登陆,不是禁止所有用户登陆。。

2007-12-11 12:28:55
假如用户A登陆后Session["SESSION_USER"] 记录,则Session["SESSION_USER"] 不为空,其它用户B登陆后,如果通过判断Session["SESSION_USER"] 是否有值,那么其他任何用户都不可能在登陆成功了!!
-----------------------------------------------------
对于这种情况只是用户A登陆后(A还未退出时)在同一个浏览器窗口中用户B再登陆会出现;如果用户A退出后,在同一浏览器窗口用用户身份登陆就不存在这个问题;如果用户A登陆后,另打开一个浏览器窗口用用户B的身份登陆也不存在这个问题;如果用户A与用户B在不同机器上同时登陆也不会存在这个问题;Session是针对于同一个浏览器进程而言的.

2007-12-11 12:36:27
个人觉得按照你以上的做法倒可以禁止同一用户在多处同时登陆.

2007-12-18 18:57:30
唉,后面的第二种处理方法呢?

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: