结合redis,实现app应用同时只允许一处登录的设计

需求

同一app应用在同一时间,只允许在最后一台登录设备上正常登录,之前设备的登录信息应被系统剔除,并给出最新登录信息的相关提示。

实际设计

不论几台设备登录,登录账号(longinAccount)是唯一的。
第1台设备登录:

  1. 登录系统时,生成token1,以longinAccount+token1(LOGIN_TOKEN1)为key,登录信息(userLoginInfo1.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
  2. 以longinAccount为key,longinAccount+token1(LOGIN_TOKEN1)为hashKey,登录设备类型(IOS/Android)为value,以Hash类型存入redis中。
  3. token1返回前端,每次请求带入验证。

如有第2台设备登录:

  1. 登录系统时,在redis中取出所有key为longinAccount的hash数据。遍历hash结构,取得longinAccount+token1(LOGIN_TOKEN1)。
  2. 在redis中以LOGIN_TOKEN1为key,取得第1台设备登录信息(userLoginInfo1),并设置其为已过期(userLoginInfo1.expire=true),且把第2台设备登录信息(userLoginInfo2),存入userLoginInfo1的expireMsg中。
  3. 更新redis中key为longinAccount+token1(LOGIN_TOKEN1)的登录信息,过期时间更新为1H。
  4. 生成token2,以longinAccount+token2(LOGIN_TOKEN2)为key,登录信息(userLoginInfo2.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
  5. token2返回前端,每次请求带入验证。

如有第3台设备登录:

  1. 登录系统时,在redis中取出所有key为longinAccount的hash数据。遍历hash结构,取得LOGIN_TOKEN1,LOGIN_TOKEN2。
  2. 在redis中以LOGIN_TOKEN1,LOGIN_TOKEN2为key,取得第1和第2台设备登录信息(userLoginInfo1,userLoginInfo2),并设置其为已过期(userLoginInfo.expire=true),且把第3台设备登录信息(userLoginInfo),存入userLoginInfo的expireMsg中。
  3. 更新redis中key为(LOGIN_TOKEN1,LOGIN_TOKEN2)的登录信息,过期时间更新为1H。
  4. 生成token3,以longinAccount+token3(LOGIN_TOKEN3)为key,登录信息(userLoginInfo3.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
  5. token3返回前端,每次请求带入验证。

在后端server拦截器中,把前端所传token,作为key,在redis中取得登录信息(userLoginInfo),如userLoginInfo.expire=true,返回前端显示最新登录内容(userLoginInfo.expireMsg),请求结束。如userLoginInfo.expire=false,则说明账号没有被其他设备登录,即可正常请求controller。

结果、现象

如有3台设备先后成功登录,则前2台登录设备在请求接口时,都会显示第3台设备已登录的信息。

注意

退出登录时,需要清除key为longinAccount+token的登录信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值