Web 项目中经常遇到的问题就是同一用户名多次登陆的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法:将登陆后的用户名放到数据库表中;登陆后的用 户名放到Session中;登陆后的用户名放到Application中;登陆后的用户名放到Cache中。一般的这几种方法都是登陆了之后,如果没有正 常退出,第二次登陆将不被允许。这样一般都会存在一个问题:如果用户没有正常退出系统,那么他接下来继续登陆的时候,因为Session没有过期等问题, 会被拒绝继续登陆系统,只能等待Session过期后才能登陆。本文介绍的方法是采用类似于MSN登陆的方法,第二次登陆时会把第一次的登陆注销掉,第一 次登陆将会类似于MSN弹出:您的帐号已在别处被登陆,您被强迫下线的提示信息。

功能实现起来也比较简单:

登陆用户名密码验证通过之后输入以下代码:

Hashtable hOnline = (Hashtable)Application["Online"];

if(hOnline != null)

{

    IDictionaryEnumerator idE = hOnline.GetEnumerator();

   
string strKey = "";

   
while(idE.MoveNext())

   
{

   
   
if(idE.Value != null && idE.Value.ToString().Equals(UserID))

   
   
{

   
   
   
   
//already login

   
   
   
   
strKey = idE.Key.ToString();

   
   
   
   
hOnline[strKey] = "XXXXXX";

   
   
   
   
break;

   
   
}

   
}

}

else

{

   
hOnline = new Hashtable();

}

hOnline[Session.SessionID] = UserID;

Application.Lock();

Application["Online"] = hOnline;

Application.UnLock();
用户登陆的时候将登陆用户名放在一个全局变量Online,Online为Hashtable结构,Key为SessionID,Value为用户名。每次
用户登陆时均判断以下要登陆的用户名在Online中是不是已经存在,如果存在该用户名已经被登陆,将第一个人登陆的SessionID对应的用户名强制
变更为XXXXXX,表示该登陆将被强制注销。

建立一个CommonPage页,系统中所有的页面都继承于CommonPage页,在CommonPage页的后台代码中添加如下代码:

override protected void OnInit(EventArgs e)

{

   
Hashtable hOnline = (Hashtable)Application["Online"];

   
if(hOnline != null)

   
{

   
   
IDictionaryEnumerator idE = hOnline.GetEnumerator();

   
   
while(idE.MoveNext())

   
   
{

   
   
   
if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))

   
   
   
{

   
   
   
   
//already login

   
   
   
   
if(idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))

   
   
   
   
{

   
   
   
   
   
hOnline.Remove(Session.SessionID);

   
   
   
   
   
Application.Lock();

   
   
   
   
   
Application["Online"] = hOnline;

   
   
   
   
   
Application.UnLock();

   
   
   
   
   
MessageBox("你的帐号已在别处登陆,你被强迫下线!",Login.aspx);

   
   
   
   
   
return false;

   
   
   
   
}

   
   
   
   
break;

   
   
   
}

   
   
}

   
}

}

继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到Login画面。

最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

Hashtable hOnline = (Hashtable)Application["Online"];

if(hOnline[Session.SessionID] != null)

{

   
hOnline.Remove(Session.SessionID);

   
Application.Lock();

   
Application["Online"] = hOnline;

   
Application.UnLock();

}

如果用户不正常退出后重登陆,因为重登陆的优先级大,不会影响用户的登陆,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。

最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:
Hashtable hOnline = (Hashtable)Application["Online"];
if(hOnline[Session.SessionID] != null)
{
     hOnline.Remove(Session.SessionID);
     Application.Lock();
     Application["Online"] = hOnline;
     Application.UnLock();
}
如果用户不正常退出后重登陆,因为重登陆的优先级大,不会影响用户的登陆,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。

Asp.net中实现同一用户名同时登陆,注销先前用户(转)的更多相关文章

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

    Web 项目中经常遇到的问题就是同一用户名多次登录的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法: 将登录后的用户名放到数据库表中: 登录后的用户名放到Session中: 登录后的用户名放 ...

  2. (转) Asp.net中实现同一用户名不能同时登录

    最近找了一些单点登录的,发现了这篇文章,貌似还是可以实现的,先保存了.   Web 项目中经常遇到的问题就是同一用户名多次登录的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法: 将登录后的用 ...

  3. ASP.NET中使用Entity Framework开发登陆注册Demo

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的第一部分 第一部分(当前) 第二部分 大完结版本 直接上步骤,有类似的开发登陆注册也可以参考. 登陆注册的 ...

  4. ASP.NET中ajax验证用户名和邮箱是否重复

    这个是前台显示的页面代码↓ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...

  5. h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题

    在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入  chrome://inspect/#devices可以用手机USB调试,打开) eg: ...

  6. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  7. 转:通过ASP.Net页面获取域用户名(当前登陆的用户)

    通过ASP.Net页面获取域用户名(当前登陆的用户) 原文地址: https://www.cnblogs.com/fast-michael/archive/2011/03/14/2057954.htm ...

  8. Asp.Net中Ajax实现登陆判断

    Default.aspx: <head runat="server"> <title>无标题页</title> <script type= ...

  9. ASP.NET中登录时记住用户名和密码(附源码下载)--ASP.NET

    必需了解的:实例需要做的是Cookie对象的创建和对Cookie对象数据的读取,通过Response对象的Cookies属性创建Cookie,通过Request对象的Cookies可以读取Cookie ...

随机推荐

  1. SQL从入门到基础 - 07 抑制重复数据

    一.去掉数据重复 distinct 1. Select FDepartment from T_Employee →select distinct FDepartment from T_Employee ...

  2. RAC 常用维护工具和命令(oracle 10g)

    Oracle 的管理可以通过OEM或者命令行接口. Oracle Clusterware的命令集可以分为以下4种: 节点层:osnodes 网络层:oifcfg 集群层:crsctl, ocrchec ...

  3. POI创建Excle

    1.导包 2.Demo Workbook wb=new HSSFWorkbook();//创建工作空间 Sheet sh= wb.createSheet("工作表1");//创建工 ...

  4. webstrom的注释

    今天我们小组的新同学有一个BUG调不好,然后我就帮他调一下.在调试的过程中非常累,纠其原因还是他注释写的不完善.我们可以看一下,他是这样写注释的(随便拿一个方法举例),如下图: 乍一看,是不是觉得他的 ...

  5. struts2标签自动错行、换行问题

    <s:radio list="#{0:'男',1:'女' }" value="student.sex" name="student.sex&qu ...

  6. GO 输出字符数同时输出这个字符串的字节数

    package main import ( "fmt" "unicode/utf8" ) func main(){ var str string str=&qu ...

  7. dom4j解析xml字符串

    import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Docume ...

  8. ulimit -t 引起的kill血案

    http://my.oschina.net/leejun2005/blog/80975 http://www.cnblogs.com/hazir/p/systemtap_introduction.ht ...

  9. Powershell使用管道

    管道并不是什么新事物,以前的Cmd控制台也有重定向的命令,例如Dir | More可以将结果分屏显示.传统的Cmd管道是基于文本的,但是Powershell是基于对象. PS> ls | Sor ...

  10. Cypress的开发板的UART接口打印调试信息

    说实话,在官方论坛现在还没有找到相关有用的消息,因为我们这个开发板的UART没引出来. http://www.cypress.com/?app=forum&id=167&rID=527 ...