我在我的网站上使用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)))
}
但这并没有解决问题。我对这种问题没有经验,希望得到一些帮助。