zoukankan      html  css  js  c++  java
  • Asp.net中防止用户多次登录的方法

    在web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。

      常见的处理方法是,在用户登录时,判断此用户是否已经在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"); 
      } 
      }

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

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

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

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

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

    以下是引用片段:

      var x=0
      function myRefresh() 
      { 
      var httpRequest 
    = new ActiveXObject("microsoft.xmlhttp"); 
      httpRequest.open(
    "GET""test.aspx"false); 
      httpRequest.send(
    null); 
      x
    ++
      
    if(x<60//60次,也就是Session真正的过期时间是30分钟 
      { 
      setTimeout(
    "myRefresh()",30*1000); //30秒 
      } 
      } 
      myRefresh();


      在web.config中设置:<sessionState mode="InProc" timeout="1"></sessionState> 

      test.aspx页面就是一个空页面,只不过需要在Page_Load中加入:Response.Expires = -1;

      保证不使用缓存,每次都能调用到这个页面。

      原理就是:设置Session的过期时间是一分钟,然后在每个页面上定时每30秒连接一次测试页面,保持Session有效,总共连60次,也就是30分钟。如果30分钟后用户还没有操作,Session就会过期。当然,如果用户直接关闭浏览器,那么一分钟后Session也会过期。这样就可以满足要求了。

  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/SoulStore/p/1222932.html
Copyright © 2011-2022 走看看