用redis存储token时,如何在用户重新登录时清除之前的token?

web11
  • 95

我想用 { token: userId } 的形式将登录后产生的token保存在redis中,当用户使用token登录时就根据token来找出对应的id,但是这样在用户重新登录(比如换个设备,之前没退出)时,该如何清除之前保存的token或者重新利用之前的没过期的token
目前已解决方案 是设置redis过期时间自动清除,但是想问问其他更佳方案。

回复
阅读 9.8k
8 个回答

确认下你的需求,你需要的是token找到userId,换设备登录的时候清除之前的token或者重新利用,观点仅供参考:
1、你的情况可能是token存在了本地,不想暴露任何用户信息,包括id,所以你生成的token作为key中肯定不包含任何的用户信息,目的就是为了通过token找到id,然后再查询出用户信息,像这种情况我目前也只是想到通过redis本身的有效期来清除这些,token的作用可以理解为一个session
2、另外一种情况,我自己就会通过本地存储的token+device_token(设备号)通过各种加密方式产生一个key,假如是同一个设备又没有过期的情况下可以反复使用,基本上和楼上观点一致

我觉得你可以根据的用户id和手机设备号做redis的键值,

通过 userId 找 token 有一个好处,可以限制同一个账号登陆的数量,例如只允许同一个账号同时有 2 个人登陆

你有两个需求:
1.通过 token 找 user
2.通过 userId 找 token

如果你要把这些数据都存 redis,那么你当然需要两组 key

我有一个大胆的想法,为啥子不保存为 userId:token 的形式呢, 下次登录的时候直接set userid token 就ok啦

实现方法:

  1. 每个用户ID对应一个token集合,比如:SADD user:123456 "user_token"

  2. 在用户重新登录的时候根据用户ID查询是否存在token,如果存在你可以删除它也可以重复利用它

查询集合成员是否存在:

SISMEMBER user:123456 "user_token"

移除集合元素:

SREM user:123456 "user_token"

希望有用。

首先过期自动清除这个肯定要有的。
还有就是用户重新登录以后你应该把这个用户之前的token清除掉,你的redis的key可以是用户的id加上token,
如key:"skjfkskdlfjksdkfslkj#1",这样就可以通过token找id,也可以通过id找到token。
当用户重新登录的时候,你肯定可以获取到用户的id,然后通过id找到老的数据,删除在添加,或者更新时间都可以。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏