大家好,我是入错行的bug猫。(/qq_41399429,谢绝转载)
今天突然有小伙伴在群里问bug猫,多终端登录怎么搞。
bug猫说,不知道百度的程序猿不是好码农!
后来bug猫自己百度一下发现,还真没有!
于是就有这篇博文了~
今天就不罗嗦,毕竟快要下班放假了
多终端登录,只保留一个移动端+PC端同时在线。类似于微信、QQ,一个账号只能是一台电脑、或者一部手机同时在线,但是电脑和手机却可以同时在线。
既然有移动端,那么后台服务系统,存放用户信息的,肯定是用缓存。使用token、或者sessionId东西,在缓存中取用户信息。
为了统一,假设就叫token
吧!
设计思路:
用户在登录的时候,需要传入登录端类型:移动端;PC端;用户信息,在缓存中分为两个部分存储: 根据token,获取到用户id,称为缓存A
----> token:userId根据用户id,获取到用户信息,称为缓存B
----> userId:userInfo 用户信息对象userInfo,里面必须要有一个Map,map键为终端类型,值为终端类型对应的token。终端类型:token值
登录流程:
假设用户在登录,已经通过账号密码的验证,并且从数据中取到User对象
生成一个新token
根据用户id,在缓存B
中,取用户信息:userInfo = getByUserId(userId)
没有缓存:可喜可贺,用户第一次登录、或者用户又回来了。将User对象,转换成userInfo
有缓存:有就有呗,可以肯定userInfo现在有值了…
判断userInfo对象中的Map,能否根据终端类型,获取到值:
有值:说明用户这个终端,之前登录过,旧token还有效;
a. 根据旧token,删除缓存A
中的数据:delByToken(token)
b. 将新token存入到Map中
c. 在缓存A
中存入数据
d. 重新将userInfo存入缓存B
中
无值:说明用户这个终端,没有登录、或者token失效:
a. 将新token存入到Map中
b. 在缓存A
中存入数据
c. 重新将userInfo存入缓存B
中
再将新token赋值给userInfo,返回给前端。注意Map不要序列化也返回了!
退出登录:
根据用户id,在缓存B
中,取用户信息:userInfo = getByUserId(userId)从Map中根据终端类型,获取token,并且将该终端对应的值删除根据token,删除缓存A
中的数据判断Map的大小:
为0,根据用户id,删除缓存B
中的数据
不为0,什么也不做
大概流程就是这样。
其他细节,略(ಡωಡ)
里面还涉及到,移动端token失效时长、移动端有token免登陆等,各自根据具体业务实现就好~
本次博文写得真愉快,以后也像这样偷懒吧 (ಡωಡ)噗