当前位置: 首页 > news >正文

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事件了!

 

转载于:https://www.cnblogs.com/shuang121/archive/2011/03/07/1974698.html

相关文章:

  • 如何应对被地下的Oracle口令加密算法(1)
  • Haproxy+Keepalived+Jboss集群实施架构一例
  • Solaris10下载、安设和设置装备摆设(2)
  • 深入浅出多线程系列之六:事件驱动异步模式(EAP,WebClient,BackgroundWorker)
  • 小本领: 一条下令装配 Firefox 3 Beta 3
  • 因子得分
  • 红旗桌面版本最新使用要领和标题解答100例-1
  • nginx 1.8.1安装使用
  • 利用Travis CI 让你的github项目持续构建(Node.js为例)
  • XP组件下看不到IIS
  • 一个绿色版的正则表达式测试工具
  • Git学习笔记(一)
  • C++ STL速查手册笔记
  • Flickr 网站架构分析
  • SEO终极算法(二)
  • Android开源项目规范总结
  • Java 23种设计模式 之单例模式 7种实现方式
  • java概述
  • Java面向对象及其三大特征
  • Java应用性能调优
  • Logstash 参考指南(目录)
  • Markdown 语法简单说明
  • Python学习之路13-记分
  • Redis字符串类型内部编码剖析
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 爱情 北京女病人
  • 电商搜索引擎的架构设计和性能优化
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • - 概述 - 《设计模式(极简c++版)》
  • 记录:CentOS7.2配置LNMP环境记录
  • 看域名解析域名安全对SEO的影响
  • 前端路由实现-history
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • zabbix3.2监控linux磁盘IO
  • 我们雇佣了一只大猴子...
  • !!Dom4j 学习笔记
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #git 撤消对文件的更改
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)windows配置JDK环境
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (转)nsfocus-绿盟科技笔试题目
  • (转)重识new
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET构架之我见
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /var/spool/postfix/maildrop 下有大量文件
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @javax.ws.rs Webservice注解
  • @ModelAttribute注解使用