在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中加入事件:οnlοad="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也会过期。这样就可以满足要求了。

转载于:https://www.cnblogs.com/zwl12549/archive/2008/02/16/1070785.html

Asp.net中防止用户多次登录的方法相关推荐

  1. ASP.NET中常用的文件上传下载方法

    ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...

  2. Oracle数据库中scott用户不存在的解决方法

    Oracle数据库中scott用户不存在的解决方法 参考文章: (1)Oracle数据库中scott用户不存在的解决方法 (2)https://www.cnblogs.com/hjweifans/p/ ...

  3. ASP.NET中在线用户统计

    天极论坛 统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率.现在,我们就介绍一个简单 ...

  4. linux强制用户改密码,如何在Linux中强制用户在下次登录时更改密码?

    由于安全方面的考虑,系统中的用户需要定期更新其密码.在本文中,我们将看到如何强制用户下次登录系统时更改其密码. 列出用户 首先让我们看一下系统中可用的用户.$ cut -d: -f1 /etc/pas ...

  5. asp.net 调用html页面,ASP.NET中HTML页面的访问验证设置方法

    可能有很多朋友和我一样不会留意到这样的问题,在ASP.NET中,使用其自身提供的访问验证功能(表单验证.Passport 验证.Windows 验证),并不会对静态文件(如 html.图像文件.文本文 ...

  6. 搜集《ASP.NET中常用的26个优化性能方法》

    1. 数据库访问性能优化 a.数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接 ...

  7. Asp.NET中常用的一些优化性能的方法

    ASP.NET 的缓存机制相比ASP有很大的改进,本文档除对常用优化方法进行总结介绍外,强调了如何使用ASP.NET的缓存来获得最佳性能. 1:不要使用不必要的session 和ASP中一样,在不必要 ...

  8. .NET技术 ASP.NET中常用的文件上传下载方法(多文件上传)

    文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以 ...

  9. ASP.NET中常用的26个优化性能方法(转)

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

最新文章

  1. 环境搭建之八-- node.js, npm和yarn
  2. 汽车之家APP口碑--参数分析
  3. Android官方培训课程中文版
  4. Asp.net生成缩略图
  5. 动态添加行 为元素解绑事件 delegate的解绑事件 off的解绑事件
  6. webpack中实现按需加载
  7. 北邮人工智能学院刘勇教授实验室,招聘博士后研究人员
  8. 打开网页出现运行脚本错误的解决技巧
  9. 简单理解下内存的几大区域
  10. Hadoop上传和下载大存储的HIVE表
  11. mac使用jeb记录
  12. mysql var和varp的区别_var方差(var和方差的区别)
  13. C++ requires a type specifier for all declarations
  14. 如何将多个excel合并成一个
  15. 初中物理浮力教学思考推荐
  16. WebBowser 实现淘宝网自动登录
  17. 人机对话是怎么产生的?
  18. 微信小程序实战教程-闫涛-专题视频课程
  19. 计算机应用技术专业的大学生职业生涯规划书,计算机应用专业大学生职业生涯规划书范文...
  20. Unity3D 之 学习路线与学习经验分享

热门文章

  1. Linux日志系统-01:什么是rsyslog?
  2. mybaits二十六:mybatis,spring整合
  3. 深入理解ASCII,Unicode和UTF-8编码
  4. 第十三章:位图(三)
  5. 二叉排序树(BST)构造与应用
  6. httpd服务的访问控制
  7. linux shell后台运行
  8. 2006.08.10
  9. 计算机网络 DNS域名
  10. SQL Server 学习笔记