首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

唯一登录的系统设计

前言

实验室某同学问我:如何禁止用户重复登录(多地点同时登录)?

这大约是一个入门级的问题,但其实聊起来还是有挺多东西的,于是写个大纲,在实验室直播时和同学们聊聊。

大纲同时作为公众号的日更,也免去了我去思考写什么的痛苦…

本文均为“伪代码”,请勿直接复制粘贴,那是运行不了滴。

需求介绍

唯一登录,指的是禁止多人同时登录同一账号,后者的登录行为,会导致前者掉线。

实现原理

必须做一个 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,还会顺便取出当前登录用户的信息。

这样做有什么意义?

后记

学编程语法,在我看来是很简单的事。

在入门之后,真正影响你能力的是业务理解与设计能力,程序员是解决问题的人,而不是创造更多的问题。

所以,尽量将问题简化,用不同角度去分析需求,思考实现方法,往往会发现 柳暗花明又一村。

实验室

就是一个想教你更多实战的地方。

实验室介绍网址:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180115B04JSS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券