关于同一用户不能同时在两台电脑上登录问题的解决方案
2009-10-23 18:23
891 查看
一切都并不是想象中的那么复杂。有些事情,即使没有百分百的把握,也得冒险一搏。
这次的单子有两个重点:
一、当某一用户在一天之内连续3次错误登录以后,限制30分钟内不可再次登录系统;
二、同一用户不能同时在两台电脑上访问系统,有点类似于QQ的登录验证机制。
具体的代码就不说了,我只是想记录一下思路,算是一个复习吧。
针对第一个问题,我是在网上查了一下资料以后才找到解决办法的。由于在同一天内错误登录了三次之后,无论是清空浏览器缓存,清空session和cookie,或者更换浏览器,甚至更换电脑都无法进行登录。那就说明,错误的记录信息是保存在服务器端的。下面我按照分步骤的方式来做说明。
一、在系统中建立一个错误登录日志表,包含以下五个字段:ID,用户名,(最后)登录时间,(最后)登录IP,登录错误次数,下一次允许登录的时间。
二、用户登录时,首先进行一项准备工作:删除当天以前的所有错误登录记录(delete from tb_failLog where datediff(day,loginTime,getdate())>0 )。这样做的目的是为了清除表中的数据冗余。然后检查错误登录用户表中是否存在该用户的错误登录记录,如果不存在,则继续进行密码验证等逻辑判断;如果存在,那么检查该用户当天的错误登录次数是否已经超过了系统限制的次数,然后再进行逻辑判断:
(1)如果已经等于或大于了系统限制,那么接着验证系统的当前时间是否大于了允许该会员下次登录的时间。如果当前时间小于允许该用户登录的时间,就直接提示该用户:您今天的登录次数已经超过了系统限制,请于系统允许的登录时间后再试。反之,则转入密码验证等逻辑判断。
(2)如果该用户的错误登录次数小于系统限制,那么也接着进行密码验证等逻辑判断。
三、用户登录错误以后,查询该表中是否具有该用户的登录错误记录,进行如下逻辑判断:
1、如果没有该用户的错误登录记录,那么写入一条新记录,该条记录中的“下一次允许登录的时间”应该是当前时间+30分钟。
2、如果有该用户的错误登录记录,那么将该用户的错误登录次数加1,同时修改最后登录时间,最后登录IP,以及设置系统下次允许的登录时间为当前时间+30分钟。
四、用户登录成功以后,删除该用户的所有错误登录记录。
这个解决办法不会给系统数据库造成太大的负担,因为数据都是即时删除掉的,最多也只会保存当天的记录。
针对第二个问题,其实我是在查了CSDN论坛上的一篇帖子之后才解决的。楼主问的问题其实和我所面对的问题完全一样。解决办法分以下五个步骤:
一、在系统中建立一个在线用户表,当用户登录系统以后,将该用户的用户名,登录时间(也叫最后活跃时间,将在后续步骤中用到),登录IP写入表中。
二、用户登录时,先检查该用户是否已经在线,若已经在线,则提示其账号已经在别处登录。
三、用户打开页面时,更新用户的最后活跃时间(也有人称之为“心跳时间”,我觉得这个比喻很贴切),同时,进行一些额外的检查(将在第五步中提到)。
四、用户正常退出系统时,删除在线用户表中的该条记录,请注意,这里说的是“正常退出”,即用户必须点击点击了系统中的“退出”链接。然后顺利的退出系统。
五、考虑到用户非正常退出的情况,比如浏览器崩溃,甚至电源突然断掉,中途断网等不可预测因素。可能会导致某一用户当前已经不在线了,但在线会员表中还是存在该会员的记录。这就需要检查用户的最后活跃时间。于是在第三步的操作中同时增加一个操作:删除最后活跃时间与当前时间相差大于10分钟的在线用户记录(delete from tb_userOnLine where datediff(minute,lastTime,getdate())>10)。
由于数据都是即时删除的,所以,系统的在线用户表不会存在太多的记录,及时有1000人同时在线,数据库的压力也不会有多大。
本文转自(小渺)在次转载是为了做个备份,自己用的时候找方便
这次的单子有两个重点:
一、当某一用户在一天之内连续3次错误登录以后,限制30分钟内不可再次登录系统;
二、同一用户不能同时在两台电脑上访问系统,有点类似于QQ的登录验证机制。
具体的代码就不说了,我只是想记录一下思路,算是一个复习吧。
针对第一个问题,我是在网上查了一下资料以后才找到解决办法的。由于在同一天内错误登录了三次之后,无论是清空浏览器缓存,清空session和cookie,或者更换浏览器,甚至更换电脑都无法进行登录。那就说明,错误的记录信息是保存在服务器端的。下面我按照分步骤的方式来做说明。
一、在系统中建立一个错误登录日志表,包含以下五个字段:ID,用户名,(最后)登录时间,(最后)登录IP,登录错误次数,下一次允许登录的时间。
二、用户登录时,首先进行一项准备工作:删除当天以前的所有错误登录记录(delete from tb_failLog where datediff(day,loginTime,getdate())>0 )。这样做的目的是为了清除表中的数据冗余。然后检查错误登录用户表中是否存在该用户的错误登录记录,如果不存在,则继续进行密码验证等逻辑判断;如果存在,那么检查该用户当天的错误登录次数是否已经超过了系统限制的次数,然后再进行逻辑判断:
(1)如果已经等于或大于了系统限制,那么接着验证系统的当前时间是否大于了允许该会员下次登录的时间。如果当前时间小于允许该用户登录的时间,就直接提示该用户:您今天的登录次数已经超过了系统限制,请于系统允许的登录时间后再试。反之,则转入密码验证等逻辑判断。
(2)如果该用户的错误登录次数小于系统限制,那么也接着进行密码验证等逻辑判断。
三、用户登录错误以后,查询该表中是否具有该用户的登录错误记录,进行如下逻辑判断:
1、如果没有该用户的错误登录记录,那么写入一条新记录,该条记录中的“下一次允许登录的时间”应该是当前时间+30分钟。
2、如果有该用户的错误登录记录,那么将该用户的错误登录次数加1,同时修改最后登录时间,最后登录IP,以及设置系统下次允许的登录时间为当前时间+30分钟。
四、用户登录成功以后,删除该用户的所有错误登录记录。
这个解决办法不会给系统数据库造成太大的负担,因为数据都是即时删除掉的,最多也只会保存当天的记录。
针对第二个问题,其实我是在查了CSDN论坛上的一篇帖子之后才解决的。楼主问的问题其实和我所面对的问题完全一样。解决办法分以下五个步骤:
一、在系统中建立一个在线用户表,当用户登录系统以后,将该用户的用户名,登录时间(也叫最后活跃时间,将在后续步骤中用到),登录IP写入表中。
二、用户登录时,先检查该用户是否已经在线,若已经在线,则提示其账号已经在别处登录。
三、用户打开页面时,更新用户的最后活跃时间(也有人称之为“心跳时间”,我觉得这个比喻很贴切),同时,进行一些额外的检查(将在第五步中提到)。
四、用户正常退出系统时,删除在线用户表中的该条记录,请注意,这里说的是“正常退出”,即用户必须点击点击了系统中的“退出”链接。然后顺利的退出系统。
五、考虑到用户非正常退出的情况,比如浏览器崩溃,甚至电源突然断掉,中途断网等不可预测因素。可能会导致某一用户当前已经不在线了,但在线会员表中还是存在该会员的记录。这就需要检查用户的最后活跃时间。于是在第三步的操作中同时增加一个操作:删除最后活跃时间与当前时间相差大于10分钟的在线用户记录(delete from tb_userOnLine where datediff(minute,lastTime,getdate())>10)。
由于数据都是即时删除的,所以,系统的在线用户表不会存在太多的记录,及时有1000人同时在线,数据库的压力也不会有多大。
本文转自(小渺)在次转载是为了做个备份,自己用的时候找方便
相关文章推荐
- 10月20日 阴 星期二 心情一般 关于同一用户不能同时在两台电脑上登录问题的解决方案
- 关于两个用户用同一浏览器不能同时登录同一网站的问题(session覆盖问题)
- 关于同一用户不能同时登录问题的探讨(1/2)
- 关于同一用户不能同时登录问题的探讨(2/2)
- 关于sqlplus 新创建的用户不能登录的问题。
- ASP.NET 2.0关于用户登录限制问题实例:防止同一用户同时登陆
- 通过SessionID和用户名来保证同一个用户不能同时登录的问题
- 一个用户同时登录两次的话,关于session回话问题
- [Silverlight学习笔记]关于用户注册之后不能直接登录的问题
- eeplat平台开发中限制多个用户同时登录同一个账号的问题解决方案
- ASP.NET 2.0关于用户登录限制问题实例:防止同一用户同时登陆
- 一种实现一个用户帐户不能同时登录的问题
- 关于在ubuntu12.04图形界面下不能从root用户直接登录的问题
- 关于RHEL 6不能用Root用户登录问题的解决
- 杂感-关于登录系统中用户不能重复登录的问题
- 关于在ubuntu12.04图形界面下不能从root用户直接登录的问题
- 关于MMC不能打开数据库问题解决方案
- 关于Oracle 12C pdb用户无法登录的问题
- Asp.net中实现同一用户名不能同时登录(单点登录)
- 关于CentOS普通用户无法登录SSH问题