需求
同一app应用在同一时间,只允许在最后一台登录设备上正常登录,之前设备的登录信息应被系统剔除,并给出最新登录信息的相关提示。
实际设计
不论几台设备登录,登录账号(longinAccount)是唯一的。
第1台设备登录:
- 登录系统时,生成token1,以longinAccount+token1(LOGIN_TOKEN1)为key,登录信息(userLoginInfo1.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
- 以longinAccount为key,longinAccount+token1(LOGIN_TOKEN1)为hashKey,登录设备类型(IOS/Android)为value,以Hash类型存入redis中。
- token1返回前端,每次请求带入验证。
如有第2台设备登录:
- 登录系统时,在redis中取出所有key为longinAccount的hash数据。遍历hash结构,取得longinAccount+token1(LOGIN_TOKEN1)。
- 在redis中以LOGIN_TOKEN1为key,取得第1台设备登录信息(userLoginInfo1),并设置其为已过期(userLoginInfo1.expire=true),且把第2台设备登录信息(userLoginInfo2),存入userLoginInfo1的expireMsg中。
- 更新redis中key为longinAccount+token1(LOGIN_TOKEN1)的登录信息,过期时间更新为1H。
- 生成token2,以longinAccount+token2(LOGIN_TOKEN2)为key,登录信息(userLoginInfo2.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
- token2返回前端,每次请求带入验证。
如有第3台设备登录:
- 登录系统时,在redis中取出所有key为longinAccount的hash数据。遍历hash结构,取得LOGIN_TOKEN1,LOGIN_TOKEN2。
- 在redis中以LOGIN_TOKEN1,LOGIN_TOKEN2为key,取得第1和第2台设备登录信息(userLoginInfo1,userLoginInfo2),并设置其为已过期(userLoginInfo.expire=true),且把第3台设备登录信息(userLoginInfo),存入userLoginInfo的expireMsg中。
- 更新redis中key为(LOGIN_TOKEN1,LOGIN_TOKEN2)的登录信息,过期时间更新为1H。
- 生成token3,以longinAccount+token3(LOGIN_TOKEN3)为key,登录信息(userLoginInfo3.expire=false,expireMsg=“”)为value,过期时间设置为2天,以String类型存入redis中。
- token3返回前端,每次请求带入验证。
在后端server拦截器中,把前端所传token,作为key,在redis中取得登录信息(userLoginInfo),如userLoginInfo.expire=true,返回前端显示最新登录内容(userLoginInfo.expireMsg),请求结束。如userLoginInfo.expire=false,则说明账号没有被其他设备登录,即可正常请求controller。
结果、现象
如有3台设备先后成功登录,则前2台登录设备在请求接口时,都会显示第3台设备已登录的信息。
注意
退出登录时,需要清除key为longinAccount+token的登录信息