
2020-08-26
发布日期:2021-05-18 08:42:37
浏览次数:10
分类:精选文章
本文共 1727 字,大约阅读时间需要 5 分钟。
引言
今天我在面试中遇到了一个技术难题,关于多台终端设备如何实现同一账号的互斥登录,同时支持手机和PC端同时在线。这让我意识到了多点登录的复杂性,并在查阅资料后找到了一个可行的解决方案。接下来我将详细记录我的思考过程和解决方案的设计细节。
问题描述
如何设计一个系统,使得同一个账号能够在多台移动终端和PC端设备上实现互斥登录,即同一个用户不能在两台设备上同时登录。同时,还要支持手机和PC端同时在线,不互相干扰的情况。这其实是一个典型的多点登录问题。
什么是多点登录?
多点登录的概念类似于微信的多终端登录功能。比如同一个QQ号,你可能在PC1上登录,之后又登录到PC2,这时候PC1会收到通知“您已在别处登录”。每一个终端只能保持一个实例登录,且后登录会踢出前一个会话。
单点登录的概念
与之对应的单点登录(SSO)是一种企业级的身份管理解决方案。通过SSO,用户只需登录一次,就能在多个互信应用系统中访问。此外,SSO通常与缓存和身份标签(如token或sessionID)结合使用,来提升用户体验和应用集成度。
多点登录的实现思路
为了实现多点登录的互斥功能,我们可以采用token机制结合缓存的方式。具体实现方式如下:
设计思路
用户登录时传递终端类型:
用户在登录时,需要指定自己的终端类型,例如“移动端”或“PC端”。这有助于区分不同终端的登录状态。缓存划分策略:
- 在缓存中分为两部分存储用户信息:
- 缓存A:根据token存储用户ID。
- 缓存B:根据用户ID存储用户信息对象(userInfo),包括终端类型与对应的token。
- 用户信息对象userInfo中需要一个终端类型映射表,记录每个终端类型对应的token。
登录流程:
- 用户登录并验证账号,假设已经从数据中获取User对象。
-
- 生成新token。
-
- 从缓存B中根据用户ID获取userInfo:
- 如果缓存B中没有 userInfo,表示用户第一次登录或返回。此时需要将User对象转换为userInfo并存入缓存B。
- 如果缓存B中已经有 userInfo,说明用户已经登录过。
-
- 检查userInfo中的终端类型映射表:
- 如果有对应的token:
- 删除缓存A中的旧token对应的记录。
- 更新token到映射表中,并将新token存入缓存A。
- 将更新后的 userInfo 存入缓存B。
- 如果没有对应的token:
- 将新token存入映射表,并将新token存入缓存A。
- 将更新后的 userInfo 存入缓存B。
-
- 将生成的新token返回给前端。
退出登录流程:
- 从缓存B中获取 userInfo。
-
- 从映射表中获取对应的token。
-
- 删除缓存A中对应token的记录。
-
- 检查映射表:
- 如果没有其他终端登录(映射表为空),则删除缓存B中的 userInfo。
- 如果还有其他终端登录(映射表不为空),则保留缓存B中的 userInfo。
优势分析
保持高效的用户体验:
用户登录时,后台只需存储必要的token和用户信息,减少了数据库查询次数。支持多终端登录:
使用token机制,每个终端都有独立的登录状态,互不干扰。降低系统资源占用:
通过缓存A和缓存B的划分,确保了内存资源的合理利用,提升系统性能。灵活扩展性:
可以根据实际业务需求,扩展终端类型或调整缓存存储策略,满足不同场景的需求。实现中的注意事项
.token的存储方式:
token需要采用适当的加密方式,避免被篡改或伪造。缓存清除策略:
在退出登录时,要确保_cache_A和_cache_B中的数据被正确清除,防止残留数据导致的问题。终端类型的定义:
在实现时,需要明确终端类型的枚举值,例如:PC端、移动端等。同时要确保后台系统支持所有可能连接的终端类型。分布式环境的支持:
如果系统分布式运行,缓存机制需要考虑分布式锁和事务处理,避免数据不一致。总结
通过以上方案,我们可以实现同一个账号在多台终端设备上的互斥登录,同时支持PC和手机端的同时在线。这一实现主要依赖于缓存技术和token机制,实现了高效的用户管理和资源利用。接下来,我将根据这个方案在后续工作中实施,并通过实际测试不断优化细节。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年05月02日 22时48分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SpamSieve for mac(邮件过滤器)
2019-03-15
炫酷的圣诞球徽标AE模板
2019-03-15
uFocus for Mac(mac文本编辑器)
2019-03-15
2017CS231n笔记5.CNN
2019-03-15
Linux系统安装Nodejs
2019-03-15
vue项目报错集合
2019-03-15
图片链接
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
Andriod进阶之路 - DataBinding的简单使用
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Linux系统时间与硬件时间及时间同步
2019-03-15
Spring 和 DI 依赖注入
2019-03-15
中序线索二叉树的遍历
2019-03-15
文字策略游戏 android studio(学习intent,textview,等等)
2019-03-15
laravel server error 服务器内部错误
2019-03-15
17_注册Github账号
2019-03-15