如何让同一个账户在同一时刻只能被一台机器登录

时间:2022-08-29 11:31:18
在用户表中加一个标志,为真时说明此账户已经有人登陆,登陆验证就会失败
当然还得过段时间就判断一下是否已经掉线,然后设置为假
或者
判断用户登陆的时候判断以下seesion_id,如果第2个人登陆后,更新这个id,第1个人就会掉下来

判断用户 是否 在线的方法,岂不是 在后台要打开一个页面,不断刷新浏览器,判断用户是否在线。

大家给个方法。

30 个解决方案

#1


HTTP是无状态的协议,只能每隔一段时间判断一下。
无法用其它方法

#2


通过session来做

#3


只能每隔一段时间判断一下:在后台要打开一个页面,不断刷新浏览器,判断用户是否在线?

#4


没有必要重开页面,你可以在要判断的页面输入下面代码进行刷新,后面的3表示3秒中刷一次

<?
  echo "<meta http-equiv=refresh content='3;'>';
?>

#5


好像只能隔几秒刷一下来判断

#6


哪位可以 给点例子。我还是有些想不通

#7


大家是否想过读取 session 临时文件。

#8


判断用户登陆的时候判断以下seesion_id,如果第2个人登陆后,更新这个id,第1个人就会掉下来
 这个怎么写?

#9


1、不需要不断刷新。只需在有登录请求时判断该用户名是否已登录和超时
2、不能用seesion_id判断。seesion_id只针对独立的连接,每个浏览器都有唯一的seesion_id
你不可能遍历全部session临时文件去查找的

#10


To  xuzuning(唠叨):我怎么判断他是否登录?数据库加入一个标记?设超时30分钟。
可是如果他10分钟页面关闭,我又怎么更新数据库呢?

#11


To  xuzuning(唠叨):我怎么判断他是否登录?数据库加入一个标记?设超时30分钟。
可是如果他10分钟页面关闭,我又怎么更新数据库呢?

那你在用户登陆的时候判断
如果上次登陆时间在10分钟之内的就说明已经登陆,警告它不让它登陆
如果上次登陆时间在30分钟以外的说明他是自己关闭的页面,放行并更新上次登陆时间

#12


是的,给用户表加一个字段记录该用户最后访问时间。
当有用户注册或访问时,检查该时间是否有或是否超时30分钟

#13


outrace(欧阳云天) :那样的说的话,问题出来了:>10 <30 可以让其他用户登录了,那绝对是不充许的。

xuzuning(唠叨) :你的意思是说:一个用户只充许在 30分钟内登录一次。

#14


理解问题
如果你设置成30分钟那么可以理解为该用户最后一次请求以后的30分钟内都视为在线
通常这个时间设的较短

#15


这个方法不好吧! 如果设较短,如10分钟,岂不是每隔 10 分钟都要重新登录一次

#16


这样一来,我只能在线用户,每隔1分钟刷新页面,更新最后登录时间,不过对服务器的负担太大了。

#17


我想通过session的值来判断,对记录的session进行判断

#18


To: 52juanjuan(Fibona) :具体点

#19


To  xuzuning(唠叨): 对于你的说法,对于在线用户是否 每个页面包含一个刷新页面。

#20


如果第2个人登陆后,更新这个id,第1个人就会掉下来这个怎么写?
我写过一个,是ip地址验证的,好处是不用考虑是否在线的问题,不过如果是那种共享上网的就没有办法了,我的思路是在登录时记录其ip地址,然后用实际得到的ip与记录中的比较,如果不同则为无效用户。这样最直接的结果就是先登录的就失效了

#21


把SESSION放到数据库里,就可以判断了

#22


用判断session或者cook的有效时间来判断

#23


方案1:
如果你的网站,访问量不大,(内部使用就2,3百人)的情况
可以采用  唠叨 的办法
==============================>
给用户表加一个字段记录该用户最后访问时间。
当有用户注册或访问时,检查该时间是否有或是否超时30分钟
==============================>
当前的用户每访问一次,每个页面的头上,都对其最后访问时间进行更新

这样的做法是,控制好,很准确,准确的符合用户的需要。
但是效率不够,因为每个页面的前面,总要更新用户最后访问的时间,以保持最新。
在访问量不高的情况下可以。
如果你的用户很多,访问也很频繁,那么方案1就不适合了,因为数据服务器的负担太重。

//--------------------------------------------------------------------------------
// 注:开个小页面刷新,不建议使用,因为其开销更大,你做个什么学习的 sample 还可以。其效率还没有 方案1好。
//--------------------------------------------------------------------------------

方案2:
把 session_id ,以及用户 login_name 存在数据库里面。
采用后登入者踢出前登入者的思路。(楼主自己也提到这点)(MSN Messager也是如此)
采用踢出的办法,比较安全。 不会存在死锁的问题。
而且对数据库的操作少,负荷轻。(建议使用)

#24


我想你被自己给弄混了吧?注意你的问题“如何让同一个账户在同一时刻只能被一台机器登录”
当用户登录时,检查该用户是否已登录,若没有登录则允许登录
扩展的说,如果你认为某用户在30分钟内没有活动就视为退出,这也是可以的

#25


单纯通过Session是不能解决的,两种方法:1。通过后台数据库或文本等方式对用户的登录状态进行标识然后处理,或者通过全局的东东作,好久不写php,记不太清了,类似application的东西。

#26


对于 liyujie2000(开心的鱼)你的方案1,大家还有没什么好办法?就是 不让第二个登录。

#27


liyujie2000(开心的鱼)你的方案2:
你认为怎么踢好?
我第二台机子登录,发现 session_id 与第一个台机子的不符,然后更新数据库,那如何踢
第一个呢?删除 session 文件?
How to do it?
session_destory()结束目前的session;
 session_unregister(); //好像不行

#28


许多大网站提供的邮箱系统都是这样的,超过一定时间没有活动就自动退出
但是在这段时间内,进行操作的话就永远不掉线
至于如何实现,我也想知道……怎么定义时间的判断呢?
要session吗,或者除了session还需要什么?

#29


就用 session!
你页面中定义一个帐户ID存放在每个页的SESSION里。

第二个用户登录以后他的帐户ID又会存在同样变量的SESSION里,自然之前的页面就不能再以以前的身份进行任何操作了。
很EASY,你可以亲自去试,不用这么多疑问。
也不需要session_destroy

#30


至于大网站的自动退出,没有什么特别的讲究,只是session_timeout()而已!
一旦session timed out,存放在SESSION里才用户ID就没有了,于是页面无法访问。

更不需要什么建立个表来跟踪时间。
唯一需要跟踪时间的可能就是统计在线人数了。

#1


HTTP是无状态的协议,只能每隔一段时间判断一下。
无法用其它方法

#2


通过session来做

#3


只能每隔一段时间判断一下:在后台要打开一个页面,不断刷新浏览器,判断用户是否在线?

#4


没有必要重开页面,你可以在要判断的页面输入下面代码进行刷新,后面的3表示3秒中刷一次

<?
  echo "<meta http-equiv=refresh content='3;'>';
?>

#5


好像只能隔几秒刷一下来判断

#6


哪位可以 给点例子。我还是有些想不通

#7


大家是否想过读取 session 临时文件。

#8


判断用户登陆的时候判断以下seesion_id,如果第2个人登陆后,更新这个id,第1个人就会掉下来
 这个怎么写?

#9


1、不需要不断刷新。只需在有登录请求时判断该用户名是否已登录和超时
2、不能用seesion_id判断。seesion_id只针对独立的连接,每个浏览器都有唯一的seesion_id
你不可能遍历全部session临时文件去查找的

#10


To  xuzuning(唠叨):我怎么判断他是否登录?数据库加入一个标记?设超时30分钟。
可是如果他10分钟页面关闭,我又怎么更新数据库呢?

#11


To  xuzuning(唠叨):我怎么判断他是否登录?数据库加入一个标记?设超时30分钟。
可是如果他10分钟页面关闭,我又怎么更新数据库呢?

那你在用户登陆的时候判断
如果上次登陆时间在10分钟之内的就说明已经登陆,警告它不让它登陆
如果上次登陆时间在30分钟以外的说明他是自己关闭的页面,放行并更新上次登陆时间

#12


是的,给用户表加一个字段记录该用户最后访问时间。
当有用户注册或访问时,检查该时间是否有或是否超时30分钟

#13


outrace(欧阳云天) :那样的说的话,问题出来了:>10 <30 可以让其他用户登录了,那绝对是不充许的。

xuzuning(唠叨) :你的意思是说:一个用户只充许在 30分钟内登录一次。

#14


理解问题
如果你设置成30分钟那么可以理解为该用户最后一次请求以后的30分钟内都视为在线
通常这个时间设的较短

#15


这个方法不好吧! 如果设较短,如10分钟,岂不是每隔 10 分钟都要重新登录一次

#16


这样一来,我只能在线用户,每隔1分钟刷新页面,更新最后登录时间,不过对服务器的负担太大了。

#17


我想通过session的值来判断,对记录的session进行判断

#18


To: 52juanjuan(Fibona) :具体点

#19


To  xuzuning(唠叨): 对于你的说法,对于在线用户是否 每个页面包含一个刷新页面。

#20


如果第2个人登陆后,更新这个id,第1个人就会掉下来这个怎么写?
我写过一个,是ip地址验证的,好处是不用考虑是否在线的问题,不过如果是那种共享上网的就没有办法了,我的思路是在登录时记录其ip地址,然后用实际得到的ip与记录中的比较,如果不同则为无效用户。这样最直接的结果就是先登录的就失效了

#21


把SESSION放到数据库里,就可以判断了

#22


用判断session或者cook的有效时间来判断

#23


方案1:
如果你的网站,访问量不大,(内部使用就2,3百人)的情况
可以采用  唠叨 的办法
==============================>
给用户表加一个字段记录该用户最后访问时间。
当有用户注册或访问时,检查该时间是否有或是否超时30分钟
==============================>
当前的用户每访问一次,每个页面的头上,都对其最后访问时间进行更新

这样的做法是,控制好,很准确,准确的符合用户的需要。
但是效率不够,因为每个页面的前面,总要更新用户最后访问的时间,以保持最新。
在访问量不高的情况下可以。
如果你的用户很多,访问也很频繁,那么方案1就不适合了,因为数据服务器的负担太重。

//--------------------------------------------------------------------------------
// 注:开个小页面刷新,不建议使用,因为其开销更大,你做个什么学习的 sample 还可以。其效率还没有 方案1好。
//--------------------------------------------------------------------------------

方案2:
把 session_id ,以及用户 login_name 存在数据库里面。
采用后登入者踢出前登入者的思路。(楼主自己也提到这点)(MSN Messager也是如此)
采用踢出的办法,比较安全。 不会存在死锁的问题。
而且对数据库的操作少,负荷轻。(建议使用)

#24


我想你被自己给弄混了吧?注意你的问题“如何让同一个账户在同一时刻只能被一台机器登录”
当用户登录时,检查该用户是否已登录,若没有登录则允许登录
扩展的说,如果你认为某用户在30分钟内没有活动就视为退出,这也是可以的

#25


单纯通过Session是不能解决的,两种方法:1。通过后台数据库或文本等方式对用户的登录状态进行标识然后处理,或者通过全局的东东作,好久不写php,记不太清了,类似application的东西。

#26


对于 liyujie2000(开心的鱼)你的方案1,大家还有没什么好办法?就是 不让第二个登录。

#27


liyujie2000(开心的鱼)你的方案2:
你认为怎么踢好?
我第二台机子登录,发现 session_id 与第一个台机子的不符,然后更新数据库,那如何踢
第一个呢?删除 session 文件?
How to do it?
session_destory()结束目前的session;
 session_unregister(); //好像不行

#28


许多大网站提供的邮箱系统都是这样的,超过一定时间没有活动就自动退出
但是在这段时间内,进行操作的话就永远不掉线
至于如何实现,我也想知道……怎么定义时间的判断呢?
要session吗,或者除了session还需要什么?

#29


就用 session!
你页面中定义一个帐户ID存放在每个页的SESSION里。

第二个用户登录以后他的帐户ID又会存在同样变量的SESSION里,自然之前的页面就不能再以以前的身份进行任何操作了。
很EASY,你可以亲自去试,不用这么多疑问。
也不需要session_destroy

#30


至于大网站的自动退出,没有什么特别的讲究,只是session_timeout()而已!
一旦session timed out,存放在SESSION里才用户ID就没有了,于是页面无法访问。

更不需要什么建立个表来跟踪时间。
唯一需要跟踪时间的可能就是统计在线人数了。