如何防止Asp.net用户多次登录

来源:互联网 发布:求质数和的算法 编辑:程序博客网 时间:2024/04/29 06:05

在web开发的过程中,同一个用户在某些系统中同一时间是只能登录一次的,如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。对于这样的情况,有什么处理方法呢?在用户登录时,首先判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):

以下是引用片段:

 

Code:
  1. stringstrUserId=txtUser.Text;   
  2.   ArrayListlist=Application.Get   
  3.       ("GLOBAL_USER_LIST")asArrayList;   
  4.   if(list==null)   
  5.   {   
  6.   list=newArrayList();   
  7.   }   
  8.   for(inti=0;i<list.Count;i++)   
  9.   {   
  10.   if(strUserId==(list[i]asstring))   
  11.   {   
  12.   //已经登录了,提示错误信息   
  13.   lblError.Text="此用户已经登录";   
  14.   return;   
  15.   }}   
  16.   list.Add(strUserId);   
  17.   Application.Add("GLOBAL_USER_LIST",list);  

当然这里使用Cache等保存也可以。

接下来就是要在用户退出的时候将此用户从Application中去除,我们可以在Global.asax的Session_End事件中处理:以下是引用片段:

Code:
  1. voidSession_End(objectsender,EventArgse)   
  2.   {   
  3.   //在会话结束时运行的代码。   
  4.   //注意:只有在Web.config文件中的sessionstate模式设置为   
  5.   //InProc时,才会引发Session_End事件。   
  6.        如果会话模式设置为StateServer   
  7.   //或SQLServer,则不会引发该事件。   
  8.   stringstrUserId=Session["SESSION_USER"]asstring;   
  9.   ArrayListlist=Application.Get("GLOBAL_USER_LIST")asArrayList;   
  10.   if(strUserId!=null&&list!=null)   
  11.   {   
  12.   list.Remove(strUserId);   
  13.   Application.Add("GLOBAL_USER_LIST",list);   
  14.   }   
  15.   }  

这些都没有问题,有问题的就是当用户直接点浏览器右上角的关闭按钮时就有问题了。因为直接关闭的话,并不会立即触发Session过期事件,也就是关闭浏览器后再来登录就登不进去了。

这里有两种处理方式:

1、使用Javascript方式

在每一个页面中加入一段javascript代码:以下是引用片段:

Code:
  1. functionwindow.onbeforeunload()   
  2.   {   
  3.   if(event.clientX>document.body   
  4.    .clientWidth&&event.clientY<0||event.altKey){   
  5.   window.open("logout.aspx");   
  6.   }   
  7.   }  

由于onbeforeunload方法在浏览器关闭、刷新、页面调转等情况下都会被执行,所以需要判断是点击了关闭按钮或是按下Alt+F4时才执行真正的关闭操作。

然后在logout.aspx的Page_Load中写和Session_End相同的方法,同时在logout.aspx中加入事件:onload="javascript:window.close()"

但是这样还是有问题,javascript在不同的浏览器中可能有不同的行为,还有就是当通过文件->关闭时没有判断到。

2、使用xmlhttp方法(这种方法测试下来没有问题)

在每个页面中加入如下的javascript(这些javascript也可以写在共通里,每个页面引入就可以了),以下是引用片段:

Code:
  1.   varx=0;   
  2.   functionmyRefresh()   
  3.   {   
  4.   varhttpRequest=   
  5.        newActiveXObject("microsoft.xmlhttp");   
  6.   httpRequest.open("GET","test.aspx",false);   
  7.   httpRequest.send(null);   
  8.   x++;   
  9.   if(x<60)//60次,   
  10.       //也就是Session真正的过期时间是30分钟   
  11.   {   
  12.   setTimeout("myRefresh()",30*1000);//30秒   
  13.   }   
  14.   }   
  15.   myRefresh();   
  16.   在web.config中设置   
  17. 以下是引用片段:   
  18.        <sessionStatemode=   
  19.        "InProc"timeout="1"></sessionState>   
  20.   test.aspx页面就是一个空页面,   
  21.        只不过需要在Page_Load中加入:   
  22.        以下是引用片段:   
  23.   Response.Expires=-1;   
  24.   保证不使用缓存,每次都能调用到这个页面。  

 

原创粉丝点击