(转) Asp.net中实现同一用户名不能同时登录
最近找了一些单点登录的,发现了这篇文章,貌似还是可以实现的,先保存了。
功能实现起来也比较简单:
登录用户名密码验证通过之后输入以下代码:
- 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();
建立一个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;
- }
- }
- }
- }
最后需要在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();
- }
1)密码验证后:
- Hashtable hOnline = (Hashtable)Application["Online"];
- if (hOnline != null)
- {
- int i = 0;
- while (i<hOnline.Count) //因小BUG所以增加此判断,强制查询到底
- {
- IDictionaryEnumerator idE = hOnline.GetEnumerator();
- string strKey = "";
- while (idE.MoveNext())
- {
- if (idE.Value != null && idE.Value.ToString().Equals(this.username.Text))
- {
- //already login
- strKey = idE.Key.ToString();
- hOnline[strKey] = "XXXXXX";
- break;
- }
- }
- i = i + 1;
- }
- }
- else
- {
- hOnline = new Hashtable();
- }
- hOnline[Session.SessionID] = this.username.Text;
- Application.Lock();
- Application["Online"] = hOnline;
- Application.UnLock();
- //用户登录的时候将登录用户名放在一个全局变量Online,Online为Hashtable结构,
- //Key为SessionID,Value为用户名。每次用户登录时均判断以下要登录的用户名在Online中是不是已经存在,
- //如果存在该用户名已经被登录,将第一个人登录的SessionID对应的用户名强制变更为XXXXXX,表示该登录将被强制注销
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.Collections;
- /// <summary>
- /// CommonPage 防止用户多点登录
- /// </summary>
- public class CommonPage: System.Web.UI.Page
- {
- public CommonPage()
- {
- //
- // TODO: 在此处添加构造函数逻辑
- //
- }
- 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();
- string js = "<script language=javascript>alert('{0}');window.location.replace('{1}')</script>";
- Response.Write(string.Format(js, "帐号已在别处登录 ,你将被强迫下线(请保管好自己的用户密码)!", "logout.aspx?cname=noadmin"));
- return;
- }
- break;
- }
- }
- }
- }
- }
3)最后需要在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();
- }
- 顶
- 0
- 踩
(转) Asp.net中实现同一用户名不能同时登录的更多相关文章
- Asp.net中实现同一用户名不能同时登录(单点登录)
Web 项目中经常遇到的问题就是同一用户名多次登录的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法: 将登录后的用户名放到数据库表中: 登录后的用户名放到Session中: 登录后的用户名放 ...
- Asp.net中实现同一用户名同时登陆,注销先前用户(转)
Web 项目中经常遇到的问题就是同一用户名多次登陆的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法:将登陆后的用户名放到数据库表中:登陆后的用 户名放到Session中:登陆后的用户名放到A ...
- ASP.NET中ajax验证用户名和邮箱是否重复
这个是前台显示的页面代码↓ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...
- ASP.NET中登录时记住用户名和密码(附源码下载)--ASP.NET
必需了解的:实例需要做的是Cookie对象的创建和对Cookie对象数据的读取,通过Response对象的Cookies属性创建Cookie,通过Request对象的Cookies可以读取Cookie ...
- asp.net中使用基于角色role的Forms验证
http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ...
- ASP.NET中的Session怎么正确使用
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
- ASP.NET中的Session怎么正确使用[转]
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
- [转]ASP.NET中的forms验证
本文转自:http://www.cnblogs.com/fengzheng126/archive/2012/04/06/2435513.html ASP.NET的安全认证:Windows验证 (默认) ...
- ASP.NET中实现页面间的参数传递
ASP.NET中实现页面间的参数传递 编写人:CC阿爸 2013-10-27 l 近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...
随机推荐
- RobotFramework 截取中文中的数字比较时长
先看下需求,这个报表中有个时长,需要对昨日和前日的时长进行比较,我们获取到的元素是例如“9分43秒”这样的格式 1.首先要讲中文中的分和秒分别提取出来 提取python代码如下: import res ...
- Redis——解决“org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'redisReferenceResolver': Unsatisfied dependency expressed through constructor parameter 0”
错误栈: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ...
- python学习_新闻联播文字版爬虫(V 1.0版)
python3的爬虫练习,爬取的是新闻联播文字版网站 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' __author__ = 'wyf349' _ ...
- jquery fadeIn()方法 语法
jquery fadeIn()方法 语法 作用:fadeIn() 方法使用淡入效果来显示被选元素,假如该元素是隐藏的.大理石平台检定规程 语法:$(selector).fadeIn(speed,cal ...
- python获取某路径下某扩展名的所有文件名和文件个数
# -*- coding: utf-8 -*- # @Time : 19-1-10 下午10:02 # @Author : Felix Wang import os def get_file_coun ...
- Minimal Labels
Minimal Labels 这个题需要用到拓扑排序的思维,但是这个题还有一个条件--字典序最小,因此可以用一个递增的优先队列来维护,每找到一个入度为 0 的点就把它 push 进去因而每一次判断的点 ...
- 2016 CCPC 长春站现场赛总结(流水账= =)
总的来说在写这篇总结的时候心情还是愉悦的,因为第一次参加区域赛就越过铜直接拿了个银~开心之情无法用语言形容啊233= =... 从杭州坐火车到长春,去的时候24个小时,回来32个小时,在路上就花了2天 ...
- Django的JWT机制工作流程
https://blog.csdn.net/bin_1022/article/details/81278513 django-rest-framework-jwt token 怎么解码得到用户名? d ...
- Leetcode题目33.搜索旋转排序数组(中等)
题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- TCP输出 之 tcp_transmit_skb
概述 tcp_transmit_skb的作用是复制或者拷贝skb,构造skb中的tcp首部,并将调用网络层的发送函数发送skb:在发送前,首先需要克隆或者复制skb,因为在成功发送到网络设备之后,sk ...