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

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过期后自动清除,不会影响系统的性能。

转载于:https://www.cnblogs.com/lorking/p/4051007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 2612 Find a way (广搜)

Problem DescriptionPass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.Yifenfei’s home is at the countryside, but Merceki’s home is in t…

使用Notepad++开发C#,一个复杂点的csscript脚本

使用Notepad开发C#,一个复杂点的csscript脚本: 12345678910111213141516171819//css_dir ....lib;//css_ref Geb.Image.dll;//css_ref Geb.Image.ShapeAnalysis.dll;//css_ref Geb.Utils.dll;//css_ref Geb.Utils.WinForm.dll;//css_co /unsafe; using S…

正则表达式里转义字符_五分钟搞定正则表达式,如果没搞定,再加两分钟

五分钟搞定正则表达式,如果没搞定,再加两分钟【这是 ZY 第 18 篇原创文章】 文章概览一、正则表达式介绍正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE&#xf…

百度富文本编辑器,改变图片上传存储路径

我用的是最新版! 找到以下2个关键文件: YourPath.../Ueditor/php/config.json YourPath.../Ueditor/php/Uploader.class.php config.json找到如下代码: "imagePathFormat": "...(这里不用管)",//找到imagePathFormat所在…

如何手动给Docker容器设置静态IP

2019独角兽企业重金招聘Python工程师标准>>> 要点: 1.首先需要在宿主机上虚拟出来一个真实可用桥接网卡比如br0 2.docker启动的时候默认使用br0进行桥接网络 3.创建docker容器的时候使用--netnone模式 4.手动为每个创建的容器生成静态ip。但是ip每次在重…

获取滚动条宽度代码(记录)

1.创建一个嵌套节点&#xff0c;让外层节点产生滚动条。 2.用offsetWidth - clientWidth 即可获得滚动条宽度。 为了避免页面抖动&#xff0c;可以设置外层元素position:absolute和visibility:hidden 代码如下&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT…

的函数原型_JS基础函数、对象和原型、原型链的关系

JS的原型、原型链一直是比较难理解的内容&#xff0c;不少初学者甚至有一定经验的老鸟都不一定能完全说清楚&#xff0c;更多的"很可能"是一知半解&#xff0c;而这部分内容又是JS的核心内容&#xff0c;想要技术进阶的话肯定不能对这个概念一知半解&#xff0c;碰到…

python字符串基本操作

直接上图&#xff1a; ispace()是否为空格 isupper()与islower是否为大写或小写 isdigit是否为数字 isalpha是否为字母 isalnum()是否为字母与数字混合体 startswith()与endswith()判断是否以什么开始&#xff0c;以什么结尾转载于:https://www.cnblogs.com/bestSmile/p/405550…

迁移学习自我学习

最近在看Ng的深度学习教程&#xff0c;看到self-taught learning的时候&#xff0c;对一些概念感到很陌生。作为还清技术债的一个环节&#xff0c;用半个下午的时间简单搜了下几个名词&#xff0c;以后如果会用到的话再深入去看。 监督学习在前一篇博客中讨论过了&#xff0c;这…

堰流实验报告思考题_堰流流量系数测定实验

二、实验操作部分1&#xff0e;实验操作过程(可用图表示)2&#xff0e;实验数据、表格及数据处理3&#xff0e;结论1.实验步骤(1)放水之前&#xff0c;用活动测针测出堰前槽底高程▽低和堰顶高程▽堰顶&#xff0c;堰高P▽堰顶-▽底。(2)关闭首部的泄水阀&#xff0c;打开进水阀…

WCF全双工以及用户名密码验证

WCF是支持TCP双向连接的&#xff0c;支持Server和Client之间互发协议&#xff0c;通过 订阅-发布 的全双工形式实现&#xff0c;全双工的用户名密码验证需要X509证书加密&#xff0c;单工模式的用户名密码验证时&#xff0c;X509证书是可选的。 在全双工模式下&#xff0c;会有…

MTV: Django眼中的MVC

URLconfMTV&#xff1a;Django眼中的MVC MVC是众所周知的模式&#xff0c;即&#xff1a;将应用程序分解成三个组成部分:model(模型),view(视图),和 controller(控制 器)。其中&#xff1a;M 管理应用程序的状态&#xff08;通常存储到数据库中&#xff09;&#xff0c;并约束改…

createbitmap导致的内存泄漏如何处理_C++ 如何避免内存泄漏,一篇就够

前言近年来&#xff0c;讨论 C 的人越来越少了&#xff0c;一方面是由于像 Python&#xff0c;Go 等优秀的语言的流行&#xff0c;另一方面&#xff0c;大家也越来越明白一个道理&#xff0c;并不是所有的场景都必须使用 C 进行开发。Python 可以应付大部分对性能要求不高的场景…

Visio绘制功能分解图

为什么要绘制功能分解图&#xff1f; 对于编程人员来说&#xff0c;具体分配任务的时候&#xff0c;必须知道自己要做什么&#xff0c;必须了解系统的大体框架。功能分解图可以帮助我们理清程序的框架&#xff0c;便于大局观的掌握。 用Visio2010创建功能分解图 1、选择模版 2、…

Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具(转)

转自&#xff1a;http://www.csdn.net/article/2013-05-02/2815116-introduce-from-mozilla-heka-go摘要&#xff1a;一直崇尚开源的Mozilla近日释放了Heka测试版——插件架构&#xff0c;Go编写。在支持使用Go扩展功能的同时&#xff0c;还通过允许“Sandboxed Filters”提供了…

cocos2d学习笔记2——学习资源

1. 视频 找了好几个视频&#xff0c;有一些讲得好的文件资源没有&#xff0c;后来终于找到一个讲得不错还有文件资源的&#xff0c;还有高清下载地址&#xff0c;虽然是2.2版本的&#xff0c;但是确实能学到不少东西&#xff0c;对用cocos2d做游戏有了基本的印象&#xff0c;对…

深究标准IO的缓存

前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊&#xff0c;没有搞明白&#xff0c;APUE中关于缓存的部分一笔带过&#xff0c;没有深究缓存的实现原理&#xff0c;这样一本被吹上天的书为什么不讲透彻呢&#xff1f;今天早上爬起来赶紧找了几篇文章看看&#x…

环境变量_配置JAVA环境变量

本文标识 : J00001本文编辑 : YiKi编程工具 : IDEA阅读时长 : 3分钟什么是环境变量?环境变量是在操作系统中一个具有特定名字的对象&#xff0c; 它包含了一个或者多个应用程序所将使用到的信息。为什么要配置环境变量?为了方便在控制台编译和运行java程序&#xff0c;不…

GotFocus和PreviewLeftButtonDown事件

当TextBox获得焦点后&#xff0c;其中的文字会被全选。通过GotFocus和PreviewLeftButtonDown事件&#xff0c;就可以模拟上述行为。 如果用户只是用键盘操作&#xff0c;GotFocus事件就足够了。 如果使用鼠标操作&#xff0c;就要用到2个事件了。TextBox会将光标放在鼠标单击的…

模式主节点ORACLE DG介绍(物理无实例)

在本文中,我们主要介绍模式主节点的内容,自我感觉有个不错的建议和大家分享下 DG的三种模式&#xff1a; 硬件以及操纵系统需求&#xff1a; 每日一道理 流逝的日子像一片片凋零的枯叶与花瓣&#xff0c;渐去渐远的是青春的纯情与浪漫。不记得曾有多少雨飘在胸前风响在耳畔&…