zoukankan      html  css  js  c++  java
  • Asp.net用户多次登录问题

     web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话会提示已经登录过来,不能再登录了

      这个问题的处理关键在与两个方面:

      一:当用户登录之后,点击退出

      二:用户退出的时候没有点击退出,直接关闭页面

    上面的两种情况第一种很好处理,我们只需要把登过的用户放到集合中,然后把集合放到application中即可,下次再登录的时候判断用户是否存在,即可,但是在退出的时候,一定要记得在退出事件中将用户移除

    部分代码如下:

        string strUserId = txtUser.Text;
      ArrayList list = Application.Get("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;
      }
      }

        Session["user"] = this.TextBox1.Text.Trim();
      list.Add(strUserId);
      Application.Add("GLOBAL_USER_LIST", list);

    退出的时候:

          string strUserId = Session["user"] as string;
            ArrayList list = Application.Get("user_list") as ArrayList;
            if (strUserId != null && list != null)
            {
                list.Remove(strUserId);
                Application.Add("user_list", list);
            }

       这样第一种就处理了

    第二种情况我们就要好好分析一下

      关闭浏览器的时候怎么才能让他执行退出里的事件,将用户直接从集合中删除呢,这个时候我们就要想到全局应用程序Global.asax的Session_End事件中处理。意思就是说我们可以设置session的过期事件,然后再过期后在session_End事件中处理这些事件,部门代码如下:

      void Session_End(object sender, EventArgs e)
        {
            //在会话结束时运行的代码。
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式
            //设置为 StateServer 或 SQLServer,则不会引发该事件。
            string strUserId = Session["user"] as string;
            ArrayList list = Application.Get("user_list") as ArrayList;
            if (strUserId != null && list != null)
            {
                list.Remove(strUserId);
                Application.Add("user_list", list);
            }
        }

    web.config中

    <sessionState mode="InProc" timeout="1"></sessionState> 

    但是,如果session的过期时间这么少,那么相应的用户就要不停的操作,否则就会过期,所以我们要相应的做一下处理,让session在半小时内不过期,始终保持有效,半小时后在不操作就会过期,当然,如果用户直接关闭浏览器,那么一分钟后Session也会过期。这样就可以满足要求了

    在每个页面中加入如下的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也会过期。这样就可以满足要求了

    所以这两种情况一结合,我们就可以直接都在Global.asax的Session_End事件中处理就可以了,在退出的事件中,我们直接将session会话取消就可以了

    Session.Abandon();

    这样就会执行Session_End事件了!

     

    多思考,多创新,才是正道!
  • 相关阅读:
    Qt 之 emit、signals、slot的使用
    qt中的 connect 函数
    进程同步:生产者消费者模型 以及解决方法
    Linux 时间 与 定时器
    Linux 环境编程:errno的基本用法
    Linux 环境编程:dirfd参数 有关解析
    Kubernetes设计理念
    禅道升级
    关闭自动更新
    linux下的特殊模式
  • 原文地址:https://www.cnblogs.com/shuang121/p/1974698.html
Copyright © 2011-2022 走看看