现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录。这里实现的是前一种功能。

网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html

实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧的SessionID,在需要单用户登录的操作时就可以判断SessionID是否匹配,不匹配则证明有其他人登录了你的账户,这时可要求重新登录或其他的操作。

实现步骤:1、登录时记录登录的用户ID+SessionID,可利用Application、Cache、数据库等。

     2、写一个过滤器用于判断当前的用户ID和SessionID跟服务器记录的是否匹配以及不匹配时进行的操作。

       3、在Session过期或者退出系统时释放资源。

步骤1:

private void GetOnline(string Name)
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline == null)
                SingleOnline = new Hashtable();

Session["mySession"] = "Test";
            //SessionID
            if (SingleOnline.ContainsKey(Name))
            {
                SingleOnline[Name] = Session.SessionID;
            }
            else
                SingleOnline.Add(Name,Session.SessionID);

System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
            System.Web.HttpContext.Current.Application.UnLock();
        }

说明:登录时将用户名(唯一标识符即可)传给该方法,该方法实现记录用户ID以及SessionID

步骤2:

public class LoginActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Hashtable singleOnline = (Hashtable)filterContext.HttpContext.Application["Online"];
            // 判断当前SessionID是否存在
            if (singleOnline != null && singleOnline.ContainsKey(filterContext.HttpContext.User.Identity.Name))
            {
                if (!singleOnline[filterContext.HttpContext.User.Identity.Name].Equals(filterContext.HttpContext.Session.SessionID))
                {
                    filterContext.Result = new ContentResult() { Content = "<script>if(confirm('你的账号已在别处登陆,是否返回登陆页面重新登陆?')){window.location.href='/Authentication/Login';}else{window.close();}</script>" };
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
说明:该过滤器用于判断是否存在重复登录的情况,过滤器怎么用这里就不多说了,若存在重复登录,则执行if语句内的处理方式,这里的处理方式是弹出个确认框,当然你也可以直接跳转到登录地址,看需要更改。

步骤3:

protected void Session_End()
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline != null && SingleOnline[User.Identity.Name] != null)
            {
                SingleOnline.Remove(Session.SessionID);
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
                System.Web.HttpContext.Current.Application.UnLock();
            }
            Session.Abandon();
        }

说明:用于释放资源,该方法放置在Global.asax里面。

总结:基本都是参考大神们的代码,不过通过自己实践,也学会了不少东西,在这里感谢一下那些在网上分享自己心得代码的朋友,通过上述方法是可以实现单用户登录的功能的,不过性能方面还没想过会不会有问题,也没试过用cache等其他方式如何实现,后续再补充吧。

转载于:https://www.cnblogs.com/LiChen19951127/p/9961633.html

ASP.NET MVC实现一个用户只能登录一次 单用户登录相关推荐

  1. Linux单用户能做什么,Linux单用户模式详解 及应用场景

    一.单用户模式简介 二.进入单用户模式修改密码 1.Centos6进入单用户修改密码 1.重启系统,进入系统欢迎界面按上下左右键进入GRUB界面: 2.在GRUB界面选择内核版本,按下'e'键: 3. ...

  2. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能...

    登录窗口已经完成了,现在可以完成最后的工作了,主要就是完成Membership提供者的配置. 首先打开Web.Config文件,在configuration段内添加一个数据库连接定义,代码如下: &l ...

  3. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)...

    应用程序的基本框架已经搭建好了,现在要做的是完成一个个的功能模块.先从简单做起,完成用户管理模块,该模块主要功能是使用一个Grid显示用户信息,并使用RowEditing进行用户的编辑.添加操作.Gr ...

  4. Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)

    前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架.ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径,这种途径可以让应用程序变得更加层次清晰,而且更加有利于对代码 ...

  5. python单用户登录_Django实现单用户登录的方法示例

    最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数 ...

  6. jmeter登录压力测试单用户和多用户登录

    1.选中测试计划,右击添加-线程-线程组: 2.添加http请求:选择线程组右击-添加-取样器-http请求:http请求:post;路径:输入地址http://XXXXXXXXXXXXXXX;参数: ...

  7. mysql8.0限制用户只能访问指定数据库,限制用户只有某种权限

    mysql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作 创建新用户: create user '#userName'@'#host' identified ...

  8. linux单用户模式single=1,Linux 单用户模式single mode

    做为一个Linux谜?每天都渴望得到新的知识,同时每天也把Linux的各个部分翻来覆去的进行着探索,在这个过程难免会让Linux无法启动.在WIN98中有一个保护模式,可以以保护模式进入到WIN98 ...

  9. linux单用户模式修复磁盘,在单用户模式下使用fsck命令修复受损的Mac硬盘

    在Mac上使用磁盘工具来恢复硬盘是官方推荐的方法,不过万一连系统都进不去就操蛋了.所以在很多情况下,在Unix/Linux系统的单用户模式下使用fsck都是最后的救命稻草. fsck 这个命令行工具在 ...

最新文章

  1. Keil μVision 5版新建工程详细步骤(版本2)
  2. centos ipv6 网卡_CentOS 6配置IPv6地址
  3. 杭电1016Java实现
  4. windows快捷键十八式(win10)
  5. 加载elementor时出现问题_不锈钢管在焊接时出现问题要怎么解决?
  6. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
  7. easyui-datebox禁止手动输入
  8. SecureRandom生成随机数慢(阻塞)问题解决记录
  9. 字符串json中函数的定义与解析
  10. 安卓rom制作教程_【教程】给ROM制作一个卡刷补丁包
  11. MagicDraw 18.5 SP4
  12. 成语接龙快速接到“一个顶俩” (附api)
  13. 演练 京东注册页面的制作 1009 HTML
  14. 用python搭建微商城_怎么搭建微商城?用什么系统好?
  15. yii2 aliases web.php,Yii2的深入学习--别名(Aliases),yii2aliases
  16. mysql--部门表员工表练习题
  17. 专访丨兼容国内外市场的代码分析软件,鉴释科技帮助企业减少bug发生率
  18. 2022年”泰迪杯“数据分析技能赛B题:银行客户忠诚度分析
  19. fstream用法总结
  20. python doc 转docx

热门文章

  1. .net Core+Dapper MySQL增删改查
  2. 90 vuex axios
  3. 如何给mysql用户分配权限
  4. TCP连接建立系列 — 服务端接收ACK段(二)
  5. Linux学习笔记(知识点总结)
  6. 让Oracle SQL Developer显示的时间包含时分秒
  7. php猴子找大王算法,php 正常的猴子选大王算法
  8. linux内核网络协议栈--发送流程及函数(十)
  9. leetcode算法题--链表中的下一个更大节点★
  10. android studio3.0升级,升级androidStudio3.0的问题