丢弃身份验证器时,如何解决与剪影Scala库的不一致问题?

时间:2019-01-08 22:22:36

标签: scala race-condition silhouette

我正在使用play-silhouette-library版本2.0.2在我的网站上进行身份验证。

现在,我有这种方法可以在用户退出时激活:

def signOut(url: String) = SecuredAction.async { implicit request =>
    val result = Future.successful(Redirect(url))
    env.eventBus.publish(LogoutEvent(request.identity, request, request2lang))
    request.authenticator.discard(result)
}

但是,仅在Chrome(而不是Firefox)上,用户大约40%的时间未退出。我认为这是由于某种情况下身份验证器丢弃而导致的,所以作为快速测试,我在身份验证器丢弃之前添加了Thread.sleep(20)

def signOut(url: String) = SecuredAction.async { implicit request =>
    val result = Future.successful(Redirect(url))
    env.eventBus.publish(LogoutEvent(request.identity, request, request2lang))
    Thread.sleep(20)
    request.authenticator.discard(result)
}

并且不会发生此问题。但是,添加Thread.sleep()调用并不完全是可用于生产的代码,因此我很难找到解决方案。

我尝试过:

def signOut(url: String) = SecuredAction.async { implicit request =>
    val publish = Future.successful(
      env.eventBus.publish(LogoutEvent(request.identity, request, request2lang))
    )
    Await.ready(publish, Duration.Inf)
    request.authenticator.discard(Future(Redirect(url)))
}

但这并不能解决问题。我对这种问题没有经验,很乐意提供帮助。

0 个答案:

没有答案