0

我在我的网站上使用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)))
}

但这并没有解决问题。我对这种问题没有经验,希望得到一些帮助。

4

0 回答 0