4

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

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

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

4

2 回答 2

6

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

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

于 2013-01-03T01:33:47.840 回答
2

您可以使用动作组合。来自 Play 2.4 文档(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

于 2016-06-09T16:06:17.790 回答