最近找了一些单点登录的,发现了这篇文章,貌似还是可以实现的,先保存了。

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

  1. Hashtable hOnline = (Hashtable)Application["Online"];
  2. if(hOnline != null)
  3. {
  4. IDictionaryEnumerator idE = hOnline.GetEnumerator();
  5. string strKey = "";
  6. while(idE.MoveNext())
  7. {
  8. if(idE.Value != null && idE.Value.ToString().Equals(UserID))
  9. {
  10. //already login
  11. strKey = idE.Key.ToString();
  12. hOnline[strKey] = "XXXXXX";
  13. break;
  14. }
  15. }
  16. }
  17. else
  18. {
  19. hOnline = new Hashtable();
  20. }
  21. hOnline[Session.SessionID] = UserID;
  22. Application.Lock();
  23. Application["Online"] = hOnline;
  24. Application.UnLock();
用户登录的时候将登录用户名放在一个全局变量Online,Online为Hashtable结构,Key为SessionID,Value为用户名。每次用户登录时均判断以下要登录的用户名在Online中是不是已经存在,如果存在该用户名已经被登录,将第一个人登录的SessionID对应的用户名强制变更为XXXXXX,表示该登录将被强制注销。
建立一个CommonPage页,系统中所有的页面都继承于CommonPage页,在CommonPage页的后台代码中添加如下代码:

  1. override protected void OnInit(EventArgs e)
  2. {
  3. Hashtable hOnline = (Hashtable)Application["Online"];
  4. if(hOnline != null)
  5. {
  6. IDictionaryEnumerator idE = hOnline.GetEnumerator();
  7. while(idE.MoveNext())
  8. {
  9. if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
  10. {
  11. //already login
  12. if(idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
  13. {
  14. hOnline.Remove(Session.SessionID);
  15. Application.Lock();
  16. Application["Online"] = hOnline;
  17. Application.UnLock();
  18. MessageBox("你的帐号已在别处登录,您被强迫下线!",Login.aspx);
  19. return false;
  20. }
  21. break;
  22. }
  23. }
  24. }
  25. }
继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到Login画面。
最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

  1. Hashtable hOnline = (Hashtable)Application["Online"];
  2. if(hOnline[Session.SessionID] != null)
  3. {
  4. hOnline.Remove(Session.SessionID);
  5. Application.Lock();
  6. Application["Online"] = hOnline;
  7. Application.UnLock();
  8. }
如果用户不正常退出后重登录,因为重登录的优先级大,不会影响用户的登录,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。 
 
为保证WEB系统安全,需要具有单点登录检测功能,Google了一下做了小小修改。 
1)密码验证后: 
  1. Hashtable hOnline = (Hashtable)Application["Online"];
  2. if (hOnline != null)
  3. {
  4. int i = 0;
  5. while (i<hOnline.Count) //因小BUG所以增加此判断,强制查询到底
  6. {
  7. IDictionaryEnumerator idE = hOnline.GetEnumerator();
  8. string strKey = "";
  9. while (idE.MoveNext())
  10. {
  11. if (idE.Value != null && idE.Value.ToString().Equals(this.username.Text))
  12. {
  13. //already login
  14. strKey = idE.Key.ToString();
  15. hOnline[strKey] = "XXXXXX";
  16. break;
  17. }
  18. }
  19. i = i + 1;
  20. }
  21. }
  22. else
  23. {
  24. hOnline = new Hashtable();
  25. }
  26. hOnline[Session.SessionID] = this.username.Text;
  27. Application.Lock();
  28. Application["Online"] = hOnline;
  29. Application.UnLock();
  30. //用户登录的时候将登录用户名放在一个全局变量Online,Online为Hashtable结构,
  31. //Key为SessionID,Value为用户名。每次用户登录时均判断以下要登录的用户名在Online中是不是已经存在,
  32. //如果存在该用户名已经被登录,将第一个人登录的SessionID对应的用户名强制变更为XXXXXX,表示该登录将被强制注销
2)建立一个CommonPage页,系统中所有的页面都继承于CommonPage页(public partial class index : CommonPage),在CommonPage页的后台代码中添加如下代码:
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.Collections;
  11. /// <summary>
  12. /// CommonPage 防止用户多点登录
  13. /// </summary>
  14. public class CommonPage: System.Web.UI.Page
  15. {
  16. public CommonPage()
  17. {
  18. //
  19. // TODO: 在此处添加构造函数逻辑
  20. //
  21. }
  22. override protected void OnInit(EventArgs e)
  23. {
  24. Hashtable hOnline = (Hashtable)Application["Online"];
  25. if (hOnline != null)
  26. {
  27. IDictionaryEnumerator idE = hOnline.GetEnumerator();
  28. while (idE.MoveNext())
  29. {
  30. if (idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
  31. {
  32. //already login
  33. if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
  34. {
  35. hOnline.Remove(Session.SessionID);
  36. Application.Lock();
  37. Application["Online"] = hOnline;
  38. Application.UnLock();
  39. string js = "<script language=javascript>alert('{0}');window.location.replace('{1}')</script>";
  40. Response.Write(string.Format(js, "帐号已在别处登录 ,你将被强迫下线(请保管好自己的用户密码)!", "logout.aspx?cname=noadmin"));
  41. return;
  42. }
  43. break;
  44. }
  45. }
  46. }
  47. }
  48. }
继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到Login画面。
3)最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

  1. Hashtable hOnline = (Hashtable)Application["Online"];
  2. if(hOnline[Session.SessionID] != null)
  3. {
  4. hOnline.Remove(Session.SessionID);
  5. Application.Lock();
  6. Application["Online"] = hOnline;
  7. Application.UnLock();
  8. }
0

(转) Asp.net中实现同一用户名不能同时登录的更多相关文章

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

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

  2. Asp.net中实现同一用户名同时登陆,注销先前用户(转)

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

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

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

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

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

  5. asp.net中使用基于角色role的Forms验证

    http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ...

  6. ASP.NET中的Session怎么正确使用

    Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...

  7. ASP.NET中的Session怎么正确使用[转]

    Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...

  8. [转]ASP.NET中的forms验证

    本文转自:http://www.cnblogs.com/fengzheng126/archive/2012/04/06/2435513.html ASP.NET的安全认证:Windows验证 (默认) ...

  9. ASP.NET中实现页面间的参数传递

    ASP.NET中实现页面间的参数传递   编写人:CC阿爸 2013-10-27 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...

随机推荐

  1. 【原】GitHub使用教程

    GitHub使用教程 1 注册 GitHub 账户 要想使用github第一步当然是注册github账号了(www.github.com). 2 安装客户端 msysgit github是服务端,要想 ...

  2. PC监听鼠标和键盘事件,定时无响应退出

    直接上代码: window.onload = function () { initScreenSaver(); } //0912 add function ScreenSaver(settings){ ...

  3. 文件操作(stat函数)

    stat函数可以获取文件信息 /*** stat.c ***/ #include<stdio.h> #include<string.h> #include<sys/sta ...

  4. Spring——顾问封装通知

    通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强 顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中  ...

  5. Python基础之Python语言类型

    编程语言主要从以下几个角度进行分类: 编译型和解释型 静态语言和动态语言 强类型定义语言和弱类型定义语言 编译和解释的区别是什么? 编译器把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样 ...

  6. 90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来

    1.for 循环 我们大部分的时候代码里面都有for循环,然后里面嵌套一段逻辑处理,下面有两种方法来完成: 二者的性能差距有多大呢,一般我们用内置的timeit模块来量化比较: 把传统的for改成推导 ...

  7. Vue_(组件通讯)子组件向父组件传值

    Vue组件 传送门 子组件向父组件传值:子组件通过$.emit()方法以事件形式向父组件发送消息传值: 使用步骤: 1.定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: ...

  8. ARTS打卡计划第五周

    Algorithms: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 采用了map的 ...

  9. uni-app 尺寸单位

    uni-app 支持的通用 css 单位包括 px.rpx px 即屏幕像素 rpx 即响应式px,一种根据屏幕宽度自适应的动态单位.以750宽的屏幕为基准,750rpx恰好为屏幕宽度.屏幕变宽,rp ...

  10. lockfree buffer test

    性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试     版权声明:本文为博主zieckey原创文章, ...