16
回答
PHP 怎么实现防止用户重复登录
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

PHP 怎么实现防止用户重复登录, 

就是用户登录网站后没有退出的话,相同账号就不能再次登录,不管是否在同一台机器,有那位大牛给普及下,谢谢

PHP
举报
jeff-lai
发帖于4年前 16回/3K+阅
共有16个答案 最后回答: 4年前

引用来自“Tuesday”的答案

主要是怎么定义: 退出  这个概念.

比如 我登录的时候就是 添加 session

退出 就是 销毁 session

--- 共有 2 条评论 ---
jeff-lai回复 @那些年我们一起 : 如果php.ini 的gc_maxlifetime 是3600 ,如果用户打开浏览器浏览网页时间到了3600,session是会被注销还是被延长存活时间 4年前 回复
那些年我们一起那你判断用户这个session是否存在,不就可以了么! 4年前 回复

找个表来记录下登录和登出,登录时生成一个加密cookie,并把相关信息,比如uid,登录时间,找个加密cookie。

当此用户主动退出的时候,主动清除表中记录和浏览器cookie,这样找个账号就释放了,再次登录重复以上。

当表中存在此用户的记录时,提示不允许登录,这点很容易做到。

不知道是否要做自动失效,那就可以跟记录表中的登录时间对比,在另外一个登录时候如果检测到有,再比较下登录时间,过期的时间直接修改为此用户生成的加密cookie和登录时间,或者删除重新插入。

至于自动延长,可以每次刷新页面时,检测是否剩余小于等于半小时,是的话,就把相应的时间都给改下。

--- 共有 3 条评论 ---
傲罗对比之前改条记录的时候,时间过期,直接删掉或者更新 4年前 回复
Lucups回复 @jeff__ : 这个没关系,等时间过了session失效就可以了。 4年前 回复
jeff-lai有些用户是直接关闭网页,非正常退出,但是session在数据库当中未被删除 4年前 回复
典型解决方法就是同步锁的概念,用户登录前检查锁、锁打开状态就可以登录、登录成功后锁关闭、退出后锁再打开。
--- 共有 2 条评论 ---
钱总回复 @jeff__ : 这就看怎么去处理、如设置超时时间、心跳或者长连接等方法 4年前 回复
jeff-lai有些用户是直接关闭网页,非正常退出,但是session在数据库当中未被删除 ,所以可能退出后,锁还是被打开的 4年前 回复

退出  是否 需要 用户点 退出的 按钮或者链接才算退出?

如果用户直接关掉网页算不算退出?

如果用户开着网页但是没有任何动作超过一天甚至一周算不算退出.

登陆 添加 session  退出销毁 session 这是程序实现层面..

那逻辑层面的呢? 你怎么定义 退出这个逻辑...

一般而言...登陆的时候 都会设置一个session/cookie 有效期 例如 一天或者一小时或者是浏览器进程..

那么退出就很好定义了

1、用户点击退出的链接或者按钮 .定义为退出 销毁session

2、用户直接关闭网页.在浏览器进程有效的情况下也定义为退出

3、用户开着网页但没有任何动作时间超过了设定的超时时间也定义为退出.

那么要实现就很简单了..只需要检测某帐号的状态以及对应session的情况..就能判定是否允许另一个用户执行登陆操作

--- 共有 5 条评论 ---
钱总回复 @酒逍遥 : 保持长连接 4年前 回复
酒逍遥@钱总 那就只能等超时时间到.要想做到网游级别的退出登,除非网页上加websocket.这样只要开着网页就算登陆.刷新网页就是先退出后登陆.不过目前的js技术已经可以实现整站不刷新浏览了.以后也是个趋势. 4年前 回复
钱总回复 @酒逍遥 : 任务管理器终止浏览器进程呢? 4年前 回复
酒逍遥@jeff__ MS js 可以实现 关闭网页的时候发退出指令到服务器 4年前 回复
jeff-lai有些用户是直接关闭网页,非正常退出,但是session在数据库当中还是存在,如果用户能够在关闭网页的时候调用退出方法就OK了 4年前 回复

这神马需求

如果一个人在出差宾馆里登录了忘记退出,还非要回去趟乎……


--- 共有 1 条评论 ---
jeff-lai当然不是 session有个存活时间,超过了存活时间,就是无效的session, 不用回去的 4年前 回复
建表存session
--- 共有 3 条评论 ---
欣儿@jeff__ 再次登录把前次的登陆信息t掉吧 4年前 回复
FrankHong回复 @jeff__ : 嗯,你这想的很全面,这个要不就忽略掉吧。。 4年前 回复
jeff-lai嗯,我也是这么做的,但是如果一个用户一登录后就直接关闭网页,session记录还在数据库当中,那么该账号在sesssion最大存活时间之中在就没有办法登录了 4年前 回复
不知道需求如何,是不是想实现单点独占登录,有人说socket或心跳,socket的话H5可以考虑websocket,心跳定时ajax定期请求就行了。但如果只是保证单点 独占登录的话,每一次登录都会生成一个令牌,令牌存在一个当前有效登录“池”里面,然后写到cookie,每次请求带上,检查在不在池,不在池就视为被T下线了,每一个端都可以登录,永远了新的登录端有效。至于session 过期按常规来处理就好了。
--- 共有 3 条评论 ---
JPer回复 @jeff__ : 浏览器如果支持html5的话,直接socket最好了,实在不行,就心跳包吧,层主说的挺详细的了 4年前 回复
jthugo回复 @jeff__ : 如果你用ajax就直接setInterval定时轮询请求就行了. 4年前 回复
jeff-lai对了 用ajax写个长连接,定时轮询,超过所设定的时间没有访问ajax,就把它从池中T了 4年前 回复
确实可以采用ajax异步实现心跳的方法,然后不建议把session存在数据库,可以放在缓存里面
--- 共有 1 条评论 ---
jeff-lai嗯,放在缓存中是会更好 4年前 回复
顶部