在 Spring 引导中验证同一用户时 JSESSIONID 或 X-AUTH-TOKEN 重复
JSESSIONID or X-AUTH-TOKEN duplicates while authenticating the same user in Spring boot
我的团队一直在使用 springboot + redis 来保护微服务,方法是将 spring-安全会话存储在 Redis 实例中,允许每个会话一个会话user(表示一个用户一次只能登录一次,如果用户同时登录两次,前一次的session将失效)。大多数时候一切都很完美,但总是如此。
有时会注意到,如果用户在 1 分钟内登录两次而没有注销前一个会话,jsessionid - 或 X-auth-token 是重复的,这意味着第二个会话 ID 与前一个会话 ID 相同,这很奇怪,理想情况下它应该使旧会话无效并创建一个新会话,而且这种情况并不总是发生,只是在某些情况下。
另请注意,有 3 个微服务实例 运行 并行并指向同一个 Redis 服务器。
有人知道如何解决这个问题吗?
您可以先删除您的 JWT 令牌 class 中的现有登录,然后像这样向 redis 添加另一个令牌:
TokenRedisDto dto = (TokenRedisDto) myRedisService.loadById(users.getUsername());
if (Objects.nonNull(dto)){
// remove previous logged-in user
myRedisService.deleteItem(dto.getId());
}
// add another token here..
myRedisService.addItem(new TokenRedisDto(users.getUsername(), token));
我在企业和个人的负载测试和操作中测试了太多次。在微服务中正常工作!
我的团队一直在使用 springboot + redis 来保护微服务,方法是将 spring-安全会话存储在 Redis 实例中,允许每个会话一个会话user(表示一个用户一次只能登录一次,如果用户同时登录两次,前一次的session将失效)。大多数时候一切都很完美,但总是如此。
有时会注意到,如果用户在 1 分钟内登录两次而没有注销前一个会话,jsessionid - 或 X-auth-token 是重复的,这意味着第二个会话 ID 与前一个会话 ID 相同,这很奇怪,理想情况下它应该使旧会话无效并创建一个新会话,而且这种情况并不总是发生,只是在某些情况下。
另请注意,有 3 个微服务实例 运行 并行并指向同一个 Redis 服务器。
有人知道如何解决这个问题吗?
您可以先删除您的 JWT 令牌 class 中的现有登录,然后像这样向 redis 添加另一个令牌:
TokenRedisDto dto = (TokenRedisDto) myRedisService.loadById(users.getUsername());
if (Objects.nonNull(dto)){
// remove previous logged-in user
myRedisService.deleteItem(dto.getId());
}
// add another token here..
myRedisService.addItem(new TokenRedisDto(users.getUsername(), token));
我在企业和个人的负载测试和操作中测试了太多次。在微服务中正常工作!