一台电脑只允许一个账号登录的实现代码

心念不空过 2016-11-22 04:11:01
一个账号已在电脑登录,当另一个账号在同一台电脑登录时,自动让第一个账号退出,怎么实现?最好有代码
...全文
1023 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
心念不空过 2016-12-06
  • 打赏
  • 举报
回复
我完成了单点登录,参考的是:http://www.cnblogs.com/xlhblogs/archive/2012/03/29/2422804.html
跳动de指尖 2016-11-24
  • 打赏
  • 举报
回复
引用 10 楼 sp1234_maJia 的回复:
在网页中,会有前端 timer 来使用 ajax 等方法来定时(例如50秒钟)访问一个 ashx。 这样你就能异步刷新上述数据记录。从而能够用来作为判断的基础。
http协议是无状态的,但是websocket这种持久化的协议来判断一个用户是否在线是很容易的。
rxw_mcdh 2016-11-24
  • 打赏
  • 举报
回复
可以使用域服务器,
  • 打赏
  • 举报
回复
而且这样也同时解决了一个账号多地登录问题……
  • 打赏
  • 举报
回复
账号登录时,获取一个GUID,并存入COOKIE中,同时将这个GUID存入数据库中(例如用户表有一个TOKEN字段专门存放每次登录这个GUID值)。 页面LOAD的时候,先读取数据库中的GUID和本地COOKIE的值是否一致,不一致则退出登录状态! 这样,当第二个账号在本地登录的时候,就会改写本地的TOKEN值,第二次登录的账号可以正常访问系统,但原先登录的账号自然就无法正常访问了,因为本地TOKEN和数据库TOKEN不一致了。 当然,多了浏览器这样是无法解决的,但同一个浏览器是可以解决的。
sp1234_maJia 2016-11-23
  • 打赏
  • 举报
回复
在网页中,会有前端 timer 来使用 ajax 等方法来定时(例如50秒钟)访问一个 ashx。 这样你就能异步刷新上述数据记录。从而能够用来作为判断的基础。
  • 打赏
  • 举报
回复
引用 6 楼 rocmeteor 的回复:
1、一个账号已在电脑登录,当另一个账号在同一台电脑登录时,自动让第一个账号退出 2、一个账号已在电脑登录,当同名账号在另一台电脑登录,如何让第一台电脑的登录退出 这是用户要我实现的两个功能
web 是无状态的。也就是说许多情况下,用户离线了,但是你不能根据什么简单 bool 值来判断他是否离线。比如说用户发呆了15分钟再看网页,请问用户离线了吗?再比如说用户断网了,或者关闭浏览器进程了,你能确定这个 bool 被改变了吗? 所以这才是这个问题的关键。如果简单说“数据库里有一个字段表示用户在一个电脑登录了”,那就等于没有搞明白底层存在的问题。
  • 打赏
  • 举报
回复
web 是无状态的。也就是说许多情况下,用户离线了,但是你不能根据什么简单 bool 值来判断他是否离线。比如说用户发呆了15分钟再看网页,请问用户离线了吗?再比如说用户断网了,或者关闭浏览器进程了,你能确定这个 bool 被改变了吗? 所以这才是这个问题的关键。如果简单说“数据库里有一个字段表示用户在一个电脑登录了”,那就等于没有搞明白底层存在的问题。
引用 6 楼 rocmeteor 的回复:
1、一个账号已在电脑登录,当另一个账号在同一台电脑登录时,自动让第一个账号退出 2、一个账号已在电脑登录,当同名账号在另一台电脑登录,如何让第一台电脑的登录退出 这是用户要我实现的两个功能
  • 打赏
  • 举报
回复
引用 楼主 rocmeteor 的回复:
一个账号已在电脑登录,当另一个账号在同一台电脑登录时,自动让第一个账号退出,怎么实现?最好有代码
对于无状态的 web 来说,需要保存每一个会话(SessionID)的“最后访问时间(当然还要包括此SessionID的登录用户信息)。然后,以此最后访问时间来判断是否用户下线(或者反过来说,以此访问时间是否未超时,来判断用户是否在线)。当处理所有重要的信息之前,可以先快速根据SessionID来找到这个数据,判断是否在线。 有这个基础,才谈得上是“判断多点登录”。当登录时,按照 “用户ID”来搜索上面的数据,如果存在属于另一个 SessionID并且“在线”的记录,你就可以实现自己的逻辑。比如说踢掉原来的记录,或者禁止当前的登录。
心念不空过 2016-11-23
  • 打赏
  • 举报
回复
1、一个账号已在电脑登录,当另一个账号在同一台电脑登录时,自动让第一个账号退出 2、一个账号已在电脑登录,当同名账号在另一台电脑登录,如何让第一台电脑的登录退出 这是用户要我实现的两个功能
Doson 2016-11-23
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
当另一个账号在同一台电脑登录时 asp.net下判断同一台电脑这个挺困难的,而且你这个需求挺奇葩,一般都是一个账号不允许多个地方登陆
可能就是你这个意思,只是没描述清楚
Doson 2016-11-23
  • 打赏
  • 举报
回复
每次登录的时候记录一下登录的时候戳,放在cache里,每个操作之前判断 cache里的时间戳 和 已登录的用户时间戳是否一致,不一致说明在另一个地方登录了,就把当前用户退出呗
  • 打赏
  • 举报
回复
当另一个账号在同一台电脑登录时 asp.net下判断同一台电脑这个挺困难的,而且你这个需求挺奇葩,一般都是一个账号不允许多个地方登陆
㤁孞 2016-11-23
  • 打赏
  • 举报
回复
可以在数据库的用户表中增加一个字段用来表示用户是否在线,在做登录操作时检查这个值,如果这个人已经在线了则不允许重复登录。
skyblue丶 2016-11-23
  • 打赏
  • 举报
回复
用AJAX吧 setInterval(singleLogin, 5000); function singleLogin() { var aj = jQuery.ajax({ url: 'Finance/Table/Index.asmx/hasOtherOneLogined',// 跳转到 action data: { username: <%="'" + this.Session["username"].ToString() + "'"%> , sessionid: <%="'" + this.Session.SessionID + "'"%> }, type: 'post', cache: false, dataType: 'text', success: function (data) { var results = data.split('%%'); if (results[1].toUpperCase() == 'TRUE') { alert("您的账号已在别的机器上登录,请检查账号安全!"); self.location='Default.aspx'; } }, error: function () { } }); } private Hashtable hOnline; public SingleLogin() { HttpContext.Current.Application.Lock(); hOnline = (Hashtable)HttpContext.Current.Application["Online"]; HttpContext.Current.Application.UnLock(); if (hOnline == null) { hOnline = new Hashtable(); } } //设置key-value对,key为登录的用户名称,值为登录时的sessionid public void SetKeyValue(string userId, string sessionId) { hOnline[userId.ToUpper()] = sessionId; HttpContext.Current.Application.Lock(); HttpContext.Current.Application["Online"] = hOnline; HttpContext.Current.Application.UnLock(); } //判定当前登录用户的sessionid是否与application中存的数据一致 public bool hasOtherOneLogined(string userId, string sessionId) { string sessionIdLogined = (string)hOnline[userId.ToUpper()]; //没有用户登录 if (sessionIdLogined.IsNullOrEmpty()) { return false; } //自己登录的 if (sessionIdLogined == sessionId) { return false; } return true; }

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧