有一款APP,可以多设备平台同时登录,但现在要求只要有一台设备用户密码修改后,所有平台必须强制退出,输入新的密码重新登录。出于用户账号安全考虑,这样的设计是必要且必须的,那么后台具体该如何实现呢?下面讲下我的思路及实现方法。
这个时候首先想到了用Redis,起初的想法很简单,在登录时以用户编号作为key, 随机一个uuidStr,String uuidStr=UUID.randomUUID().toString().replaceAll("-", “”);作为value,在登录时将此key-value 存入Redis,在接口拦截器里过滤掉登录接口,当调用为非登录接口时,用传过来的用户编号作为key去拿Redis里的value,如果拿到的value为空,则对外抛出异常,APP端收到异常状态后控制跳转到登录页。当修改密码时,会清掉Redis里所有key值为用户编号的键值对。这样当修改密码时,所有登录用户就会因为取不到Redis里的value而被跳转到登录页,从而解决问题。
但在实现上却出现了问题,首先,系统里其他业务里已经出现了以用户编号为key的Redis缓存,如果以用户编号清除,会不会影响其他业务?其次,还有个更严重的问题:假如有A和B两个设备登录了小明的账户,其中小明在A设备上修改了密码,此时Redis被清空,但小明又在A设备上重新登录,此时Redis中又存入了以小明用户编号为key的值,B设备去访问其他功能的接口,由于不同设备key没有区分,都是小明的用户编号,所以到了过滤器里仍然能通过Redis校验,去访问其他接口服务,而不会被退出登录。
为了解决这两个问题,我首先把key的