一个基于spring、Shiro、redis和mysql 8的系统近期出现用户AccessToken冲突:用户A登录后,获取到的用户信息却是用户B的。此问题即使清除缓存后依然复现,严重影响系统稳定性。本文将深入分析问题根源并提供有效解决方案。
已排除redis缓存问题和token重复使用可能性,问题不在token生成机制或Redis操作错误。 开发者怀疑Shiro框架未启用accessToken/refreshToken机制导致问题,但这并非直接原因。accessToken/refreshToken机制主要用于token刷新,而非解决token冲突。
问题的核心在于token的生成和存储逻辑。即使使用UUID生成token,若未进行有效唯一性校验,仍可能发生冲突。 高并发情况下,多个用户同时登录,若未在数据库或Redis中检查token是否存在,则可能导致token重复分配,从而引发冲突。
因此,关键在于生成并保存token前,必须检查其唯一性。 若发现冲突,则需重新生成,直到获得唯一token为止。 这需要改进token生成和存储逻辑,添加唯一性校验步骤。 具体实现可通过在保存token前查询数据库或Redis,检查token是否存在。若存在,则重新生成并重复此过程,直至生成唯一token。 此方法可有效避免token冲突,解决AccessToken混淆问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END