8

我有一个使用 zentasks 示例中描述的 isAuthenticated 模式的应用程序。它还使用 Future/Async 来最小化阻塞......

  def index = isAuthenticated { username => implicit request =>        
    val promise = 
      Future {
        Foo.all()    
      }
    Async {
      promise.map(f => Ok(views.html.foo.index(username, f)))
    }        
  }

这在 Play 2.2.0 中继续有效,但已弃用 Future/Async 模式。我们应该使用 Action.async;就像是:

  def asyncTest = Action.async {
    val fut = Future {
      // Artificial delay to test.
      Thread.sleep(5000)
      "McFly"
    }
    fut.map (f => Ok(f))      
  }

我的问题是;我将如何将 Action.async 与上述身份验证方法或类似方法一起使用?

4

1 回答 1

7

一种选择是通过如下定义来使用动作组合IsAuthenticated

def username(request: RequestHeader) = request.session.get("email")

def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login)

def IsAuthenticated(f: => String => Request[AnyContent] => Future[SimpleResult]) = {
  Action.async { request =>
    username(request).map { login =>
      f(login)(request)        
    }.getOrElse(Future.successful(onUnauthorized(request)))
  }
}

然后你可以通过以下方式使用它:

def index = IsAuthenticated { user => implicit request =>
  val fut = Future {
    // Artificial delay to test.
    Thread.sleep(5000)
    "McFly"
  }
  fut.map (f => Ok(f))      
}
于 2013-11-12T21:40:41.713 回答