记住,当两个或多个请求同时出现时,我失败了。 (没有Spring Security)

时间:2017-05-29 07:47:48

标签: spring cookies spring-security interceptor remember-me

我正在尝试解决与记忆有关的问题。此功能是手动构建的,没有Spring Security。以下是一些细节。

  • 我想使用Spring Security实现remember-me功能,但......
    • 我们的数据库中没有用户相关数据。只能使用第三方API访问数据。 API通过cookie返回数据。我不知道如何在Spring Security中使用它。
    • 我正在使用没有Spring Security的旧服务器。实施Spring Security可能有点迟了。
  • 所以我决定使用引用this的拦截器制作我自己的版本。它的工作原理如下。
    • 记住我的cookie存储“{series}:{hashed token}”string value。
    • DB有一个记住我的表,用于存储系列,加密的令牌,用户ID。
    • 当用户记住我并且会话中没有用户数据时,任何请求都会触发记住我的拦截器。
    • 拦截器比较cookie和DB之间的remember-me值。如果匹配,请执行登录过程并更新令牌。否则删除cookie值。
  • 大多数情况下都能正常工作。但...
    • 同步问题:有时,两个请求同时来自用户(我不知道为什么)。请求更新令牌。但另一方不知道这一点。因此令牌是不同的。删除cookie。用户尚未登录。
    • 可能还有其他我不认识的问题。
    • 此服务器有多个实例。所以我猜同步块不起作用。
    • 我不知道为什么会发生这种双重请求。我正在研究它,但到目前为止还没有运气。
  • 考虑解决方案
    • 当记住我的尝试失败时,不要删除cookie。因此,当下一个请求到来时,cookie将保留并重试。
    • 记住我的表记录更新的日期时间。因此,如果当前时间和更新时间之间的时间小于x秒,我可以忽略请求。

如何解决此同步问题?

0 个答案:

没有答案