前一段在开发一个项目中,需求人员希望能防止同一个用户在同一时间多次登录系统。于是在我们博客园里搜索相关文章,发现解决方案几乎都是千篇一律。见 防止用户多次登录

这种方案个人觉得有两点不足之处:

1、频繁与服务器交互

2、只要用户已登录,就不能再次登录了

我们知道在一台机子上登录QQ后,再到另外一台机子上同样也是可以登录的,不过之前登录的会被 踢掉。我觉得这种方案比较人性化。如果在家里登录QQ后,忘了退出,然后在公司登录时提示“此用户已经登录”,不知你会有何感受?!

解决方法:

1、 用户登录系统时,分配一个GUID给他。如果是用户是首次登录就往Application["OnlineUserList"]中添加一条记录,下次再登录,系统会重新分配一个新GUID,修改已存在的记录值。

2、页面继承基类中,判断客户端保存的cookie["UserOnlineID"] 值是否与服务端一致,如果不一致,则重定向到重复登录页面。

登录用户存入全局Application对象中,

Guid.NewGuid().ToString();
 )
                    {
 ();

{
;
 (userlist.ContainsKey(userId))
                    {
 m_strUserOnlineID;

{
                        userlist.Add(userId, m_strUserOnlineID);
                    }
, userlist);

登录成功时处理
/* 登录用户存入全局Application对象中,
 * 如果已存在,则修改系统之前分配的Guid标识
 */
string m_strUserOnlineID = Guid.NewGuid().ToString();
Dictionary<string, string> userlist;

if (Application["OnlineUserList"] == null)
{
    userlist = new Dictionary<string, string>();
}
else
{
    userlist = Application["OnlineUserList"] as Dictionary<string, string>;
}

if (userlist.ContainsKey(userId))
{
    userlist[userId] = m_strUserOnlineID;
}
else
{
    userlist.Add(userId, m_strUserOnlineID);
}
Application.Add("OnlineUserList", userlist);
WebGlobal.SetCookie("UserOnlineID", m_strUserOnlineID);
/******** End *******/

页面继承基类
protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);

//对登录用户进行页面访问验证
    if (!string.IsNullOrEmpty(HttpContext.Current.User.Identity))
    {
        /* 获取客户端的用户在线标识Guid
         * 如果标识Guid与服务端不一致,则重定向到重复登录页面
         */
        string m_strUserOnlineID = WebGlobal.GetCookie("UserOnlineID");
        if (!string.IsNullOrEmpty(m_strUserOnlineID))
        {
            Dictionary<string, string> userlist = Application["OnlineUserList"] as Dictionary<string, string>;
            if (m_strUserOnlineID != userlist[HttpContext.Current.User.Identity])
            {
                Response.Redirect("~/subscribed.shtml");
            }
        }
        /******** End *******/
    }
}

Hope this helps

转载于:https://www.cnblogs.com/hailibu/archive/2009/06/09/1499744.html

同一用户最新登录踢掉历史登录【原创】相关推荐

  1. mysql踢掉登录用户_centos 强制踢掉某登录用户的方法

    linux是一个多用户操作系统,用户可以在不同的地方链接上LINUX服务器,在系统中我们可以用w或者who来查看用户 [root@7273 ~]# who root pts/0 2018-05-5 2 ...

  2. Linux用root强制踢掉已登录用户

    首先使用w命令查看所有在线用户: [root@VM_152_184_centos /]# w20:50:14 up 9 days, 5:58, 3 users, load average: 0.21, ...

  3. web端同一账户同时登陆踢掉前一个登录的用户

    这边我们理想是使用localstorage去存取用户登录信息,因为是保存在客户端本地,无需访问服务器,且可实现永久保存,节省网络流量 关于cookie和session和storage的详细解说网址: ...

  4. 【Spring Security】如何实现多设备同一时间只允许一个账号登录(即前登录用户被后登录用户挤下线)?只需简单两步!

    1.需求分析 在同一个系统中,我们可能只允许一个用户在一个终端上登录,一般来说这可能是出于安全方面的考虑,但是也有一些情况是出于业务上的考虑,需求就是业务原因要求一个用户只能在一个设备上登录. 要实现 ...

  5. springboot + shiro之登录人数限制、登录判断重定向、session时间设置

    springboot + shiro之登录人数控制 项目 前篇:spring boot + mybatis + layui + shiro后台权限管理系统:https://blog.51cto.com ...

  6. 2021-01-15:用户登录,保存30天的免登,只允许两个设备登录,如果有第三个设备登录,踢掉第一个。改密码的时候,所有设备需要下线。这个逻辑怎么实现呢?

    福哥答案2021-01-15: 一.我想到的答案. 为什么不能用设备id? 接口调用,如果是网页,设备id是无法获取的.另外,设备id可以作假. 为什么不能用ip区分? 有些网络(某些校园网),对外就 ...

  7. 通用权限管理系统组件 (GPM - General Permissions Manager) 中后一个登录的把前一个登录的踢掉功能的实现...

    最近客户有需要,同一个帐户可以重复登录系统,但是后登录的账户需要把前面已经登录的账户踢掉,例如客户把电脑打开在别的电脑上然后换一个房间,或者换个办公楼想登录时就会遇到很多麻烦,遇到郁闷的情况就是死活无 ...

  8. java 登录踢出_spring security 4 如何踢出用户?

    项目用的是spring boot 1.3 全javaconfig 配置 目的 : 我要踢出一个登录在线的用户,踢出后,剔出的用户再次访问服务器的时候会去到登录界面, security 配置 : htt ...

  9. 用户唯一登录,最新登录挤掉以前的登录,实现踢人.

    最近在做一个功能,要求是这样的:相同的账号,例如admin账号,在A电脑登录成功,然后admin账号在B电脑登录,系统发现admin账号出现了重复登录,A电脑上登录的admin账号就会被退出登录. 流 ...

最新文章

  1. Microbiome:马铃薯疮痂病与土壤微生物组关系新进展
  2. (转) Docker EE/Docker CE简介与版本规划
  3. 全球著名 CMS 产品大全
  4. Java黑皮书课后题第5章:5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格
  5. [攻防世界 pwn]——hello_pwn
  6. 南京大学获赠1.2亿!
  7. java 自定义 operator_见微知著——从自定义类型的operator==说起
  8. Python无参装饰器
  9. 手机内存8+128与6+256价格相同,你会选哪个?
  10. 自动驾驶是一门怎样的生意?盘点5家创业公司商业落地的3条逻辑
  11. java图书管理系统源代码_高校社团管理系统(ssm+mysql)
  12. Aiseesoft Data Recovery for mac(专业数据恢复软件)
  13. Windows安装numpy详细教程
  14. 自动补全 (自定义)拼音分词器 搜索时注意事项
  15. 分割 fasta 文件
  16. amd RX6800和rtx3070哪个好
  17. 全志V3s学习记录(13)OV2640的使用
  18. 2022-2028年全球冷轧钢卷行业供需分析及发展前景研究报告
  19. ges resource dynamic 和 ges enqueues较高导致数据库宕机
  20. 杜绝「断裂」【2022戴尔科技峰会预告】

热门文章

  1. ninjala服务器维护,Ninjala2.0版本更新内容一览
  2. cad vba编程从入门到精通_【科研资源02】C语言和C++编程110G从入门到精通自学教程...
  3. html文件整体结构,HTML文件基本结构
  4. Docker之Docker网络讲解
  5. asm冗余 oracle_oracle 11.2.0.1 rac 修改asm磁盘组的冗余模式(redundancy mode)为normal
  6. php r很卡,Laravel 在高并发下很卡?求大神解答
  7. android上最好的linux终端,如何在带有Termux的Android上使用Linux命令行 | MOS86
  8. arm汇编指令WFI和WFE
  9. 学习笔记--asp.net主题和外观(转自msdn,仅为自己学习存储和有意读者使用)
  10. mfc listbox删除多行