前言
实验室某同学问我:如何禁止用户重复登录(多地点同时登录)?
这大约是一个入门级的问题,但其实聊起来还是有挺多东西的,于是写个大纲,在实验室直播时和同学们聊聊。
大纲同时作为公众号的日更,也免去了我去思考写什么的痛苦…
注
本文均为“伪代码”,请勿直接复制粘贴,那是运行不了滴。
需求介绍
唯一登录,指的是禁止多人同时登录同一账号,后者的登录行为,会导致前者掉线。
实现原理
必须做一个 if 判断
想实现唯一登录,必须有这么个判断条件。
如何判断 “已登录”
在处理用户登录的业务流程中,比如加点料。
在用户登录的时候,login_status 值等于 1,就知道 “当前账号已登录”
再套用上一段的判断条件:
搞定了?事情没有这么简单。
login_status 什么时候 = 0?
退出登录的时候,置为 0
如何退出登录?
完美状态下,用户点一个 “退出登录” 的按钮,然后我们这样做:
用户如果直接关闭浏览器呢?
关闭浏览器后,session 默认会自动销毁,也能实现退出登录,但是这样一来 login_status 的值就出问题了。
当然
我们还有很多解决方法,比如用 ajax 每隔1分钟请求一次,如果没有按时请求则认为用户掉线。不过,这样一定会适当的增加服务器负载,并且要考虑用户同时打开多个网页时的处理情况。
更专业一点的,我们可以用 webSocket,能够大幅降低延迟,等等…
但是
我们要换一个思路去想,我们的目的是 “后登录的用户,顶掉前者”,是否有其他实现方案呢?
更好的解决方法
每次登录时,生成一个随机的字符串(Token),同时保存在 数据库、session中。
每次刷新网页时,判断session.token、数据库.token,是否一致。
实现的流程,大体如下。
登录业务流程
如果重复登录
假设 A,B 二人依次登录同一账号,数据库最终保存的 token 是 B的。
这句话极为重要,如果没有理解,就反复看文章吧。
所有会员页面,添加代码
以上代码,实现了顶替的过程。
差不多了,不过还有些问题要大家思考
A 用户,如果不刷新网页,会发现自己被顶替吗?
应该使用什么规则来生成 token?
如何做架构,才能降低验证代码的重复性。
如果不是网页,而是一个 手机应用 接口呢?
需求设计无止境,这样说起来,你大约明白为什么有些系统要几十上百人的去开发了吧?
你大约应该也知道为什么改需求最烦人了。
请实验室同学额外思考如下问题
登录日志有什么用吗?
我在你们的 dev3 项目中,都提出一个要求,每个用户必须拥有自己的登录日志。
其实,借助登录日志,我们也能实现类似的需求。
验证登录状态时
我在很多课程中,在判断登录状态时,不光会验证session,还会顺便取出当前登录用户的信息。
这样做有什么意义?
后记
学编程语法,在我看来是很简单的事。
在入门之后,真正影响你能力的是业务理解与设计能力,程序员是解决问题的人,而不是创造更多的问题。
所以,尽量将问题简化,用不同角度去分析需求,思考实现方法,往往会发现 柳暗花明又一村。
实验室
就是一个想教你更多实战的地方。
实验室介绍网址:
领取专属 10元无门槛券
私享最新 技术干货