`

一个用户在同一时间只能登录一次

阅读更多

看到一篇bolg,挺不错的,mark一下

http://www.cnblogs.com/wifi/archive/2011/11/25/2263252.html

在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中加入事件:


  但是这样还是有问题,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也会过期。这样就可以满足要求了。

分享到:
评论

相关推荐

    同一个账号,同一时间只能允许他登录一次

    在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...

    利用spring security控制同一个用户只能一次登陆

    通过以上步骤,我们就可以在Spring Security框架下实现单点登录,确保用户在同一时间只能在一个设备或浏览器上登录。这样的机制有助于提高系统的安全性,防止账户被恶意操作。标签“源码”表明了可能需要深入阅读和...

    Asp.net中实现同一用户名不能同时登陆

    因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及步骤 本文介绍的方法主要是通过ASP.NET中的全局状态存储机制来实现的,具体步骤如下: 1. **使用Application对象存储在线...

    防止同一账号多个用户同时登陆的解决方法.txt

    3. **处理登录冲突**:一旦检测到同一账号在不同位置尝试登录,系统会将之前的登录状态`Login_status`设置回0,强制下线之前的登录会话,从而确保同一账号在同一时间只能在一个地方登录。 #### 利用ASP.NET管理登录...

    asp.net 防止同一用户同时登陆

    在ASP.NET开发中,确保系统安全性的一个关键方面是防止同一用户在同一时间从多个设备或浏览器窗口登录。这种安全措施不仅可以防止潜在的安全威胁,如账户冒用,还可以避免因多处登录而造成的资源浪费和数据冲突。...

    ASP.NET 2.0实现防止同一用户同时登陆

    在实际的应用场景中,为了提高系统的安全性以及用户体验,很多系统都需要实现同一个用户在同一时间只能在一个地方登录的功能。这样的设计可以有效避免用户账号被恶意盗用的风险,并且能够确保数据的安全性。在 ASP...

    防止一个用户登录多次的方法

    为了达到“同一时间只能登录一次”的目的,我们需要维护一个全局的记录来跟踪用户的登录状态。通常来说,可以使用服务器端的存储机制(如ASP.NET中的`Application`对象)来保存当前所有在线用户的列表。每当有新的...

    同一账号不能同时登陆

    当用户登录成功后,服务器会生成一个唯一的Session ID,并将其发送给客户端,通常保存在Cookie中。每当客户端发送请求时,都会带上这个Session ID,服务器通过识别Session ID来判断是否为同一账号。 要实现“同一...

    同一账号不能两次登陆实现示例

    在IT行业中,尤其是在开发多用户应用时,"同一账号不能两次登陆实现" 是一个重要的功能需求,它确保了用户账号的安全性和唯一性。这个功能的主要目的是防止同一账号在不同的设备或者浏览器上同时登录,以避免账号被...

    Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录

    在Java Web开发中,实现QQ登录功能并限制一个账号同一时间只能一个人登录,涉及到的关键技术包括用户会话管理、状态跟踪以及异常情况处理。以下是对这个功能实现的详细解析: 首先,我们需要一个全局的存储结构来...

    C#两个账号同时登录,后登录的账号将前一个账号挤掉

    在C#编程中,"同一个账号只能登录一次"的需求是一个常见的多用户系统设计规范,它旨在确保用户账户的安全性和系统的一致性。当一个账号在一处登录后,其他地方的同一账号尝试登录时,系统应该拒绝该请求或者强制结束...

    Asp.net中实现同一用户名不能同时登陆(单点登陆)

    很多开发者都会遇到这样的情况:如何使同一个用户在同一时间内只允许登录一次。常见的解决方案是使用数据库中标识字段,登录时置 1,退出时置 0,但是这种方法存在一些问题,如用户直接关闭浏览器而不是通过程序中的...

    集群式项目解决一个账号只能登录一次。

    这里我们探讨的是一种集群环境下的解决方案,它允许我们确保一个账号在同一时间只能在一个地方登录,即实现“单点登录”功能。这个方案主要基于Spring Boot和Redis技术栈来实施。 **Spring Boot** 是一种基于Java的...

    php有效防止同一用户多次登录

    在PHP开发中,确保同一用户在同一时间只能有一个有效的登录状态是非常重要的,这有助于增强系统的安全性。以下是关于如何防止同一用户多次登录的详细解决方案: 1. **重新生成session_id**: 当用户身份验证成功后...

    C#一个账号只允许一个人登录的程序

    这个程序的核心理念是确保同一时间只有一个用户能够使用特定的账号进行登录,防止了多个人同时操作同一账号的情况,增加了系统的安全性。 首先,我们需要理解这个程序的基本架构。它通常包含以下几个关键部分: 1....

    asp.net下一个账号不允许多个用户同时在线,重复登陆的代码

    方法一: 复制代码 代码如下: string sKey = username.Text.ToString().Trim(); // 得到Cache中的给定Key的值 string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在 if (sUser == null || sUser == String...

    Web单点登录 禁止多用户登录

    在"Web单点登录 禁止多用户登录"的场景下,系统设计的目标是确保同一账号在同一时间只能有一个用户在线。这种机制通常用于防止未经授权的多用户同时使用一个账号,从而保护用户的隐私和数据安全。例如,如果一个账号...

    Java 多用户登录限制的实现方法

    场景一要求同一时刻同一个用户只能在一个地方登录,如果尝试在另一处登录,前一次的登录会话将会被终止。场景二则是允许用户在不同设备或浏览器上登录,但当新的登录发生时,旧的登录会话会被挤掉,并且通知用户这一...

    Asp.net中防止用户多次登录的方法.rar

    在Asp.net开发环境中,确保用户只能在一个设备或浏览器会话中登录,是保障系统安全性和用户体验的重要环节。本教程将深入探讨防止用户多次登录的方法,以避免账号被恶意使用或者用户无意间在多处登录导致的数据混乱...

    ASP.NET实现的图片上传功能

    一个用户只能在同一时间登陆一次,需要经过电脑ip验证,用户名和密码验证,全部通过才可以进入首页。 用户登录:首先进入首页,显示该用户今天上传的图片。 1.查看图片:显示该用 户上传的所有图片,显示内容:图像...

Global site tag (gtag.js) - Google Analytics