JSESSIONID 或 X-AUTH-TOKEN 在 Spring boot 中对同一用户进行身份验证时重复

Posted

技术标签:

【中文标题】JSESSIONID 或 X-AUTH-TOKEN 在 Spring boot 中对同一用户进行身份验证时重复【英文标题】:JSESSIONID or X-AUTH-TOKEN duplicates while authenticating the same user in Spring boot 【发布时间】:2021-03-25 01:15:06 【问题描述】:

我的团队一直在使用 springboot + redis 来保护微服务,方法是将 spring-security 会话存储在 Redis 实例中,允许每个用户使用一个会话(意味着用户一次只能登录一次,如果用户同时登录两次,之前的会话将失效)。大多数时候一切都很完美,但总是如此。

在某些情况下,如果用户在 1 分钟内登录两次而没有注销上一个会话,则 jsessionid - 或 X-auth-token 会重复,这意味着第二个 session-id 与前一个相同,这很奇怪,理想情况下它应该使旧会话无效并创建一个新会话,而且这种情况并不总是发生,仅在某些情况下。

还要注意,有 3 个微服务实例并行运行并指向同一个 Redis 服务器。

有人知道如何解决这个问题吗?

【问题讨论】:

谁能解决这个问题?我们不知道您的代码是什么样的,因为我们知道您可能编写了一个糟糕的实现。在你提问之前,请阅读如何提出一个好问题***.com/help/how-to-ask。投票结束 【参考方案1】:

你可以先在你的 JWT Token 类中删除现有的登录,然后像这样向 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));

我在企业和个人的负载测试和操作中测试了太多次。在微服务中正常工作!

【讨论】:

以上是关于JSESSIONID 或 X-AUTH-TOKEN 在 Spring boot 中对同一用户进行身份验证时重复的主要内容,如果未能解决你的问题,请参考以下文章

Edusoho之X-Auth-Token

Authentication与X-AUTH-Token

Jsessionid和cookie的区别与联系

X-Auth-Token 在 1 个会话后无效

AngularJS:未发送 X-Auth-Token(错误 401)

如何使用 servlet 或配置文件本身将 samesite = strict 添加到 weblogic 服务器中的 JSESSIONID cookie?