如何拦截Play 2 + Scala中的所有控制器请求?

时间:2013-01-03 00:28:29

标签: scala playframework

在Play 2的Java风格中,有GlobalSettings.onRequest,可用于拦截所有对控制器的传入请求。但是在Scala equivalent中,没有onRequest处理程序。

我怀疑这是因为Scala中不需要Java中需要的Action委托逻辑,但它相当烦人,因为我想在每个传入的控制器请求上运行一些代码。

有没有人知道如何拦截Scala + Play 2应用程序中的所有控制器请求?

2 个答案:

答案 0 :(得分:6)

覆盖def onRouteRequest (request: RequestHeader): Option[Handler] Global object可能是您正在寻找的答案。

从2.0.4 api开始,在收到HTTP请求时调用它。

答案 1 :(得分:1)

您可以使用动作合成。来自Play 2.4 docs(https://www.playframework.com/documentation/2.4.x/ScalaActionsComposition):

import play.api.mvc._

object LoggingAction extends ActionBuilder[Request] {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
    Logger.info("Calling action")
    block(request)
  }
}

然后在你的控制器中:

def index = LoggingAction {
  Ok("Hello World")
}

当我需要为每个请求运行代码时,这就是我所做的。实际上,您可以通过使用或不使用自定义操作来控制执行哪些请求,您仍然可以这样做

def index = Action {
  Ok("Hello World")
}

希望这会对你有所帮助。

修改

我刚刚读到你想要一个2.0兼容的解决方案。这适用于Play 2.0,这是文档:https://www.playframework.com/documentation/2.0.x/ScalaActionsComposition