在 Play 2 的 Java 风格中,有GlobalSettings.onRequest,可用于拦截所有传入控制器的请求。但是在等效的 Scala中,没有 onRequest 处理程序。
我怀疑这是因为 Java 中需要的动作委托逻辑在 Scala 中是不需要的,但这很烦人,因为我想在每个传入的控制器请求上运行一些代码。
有谁知道如何在 Scala + Play 2 应用程序中拦截所有控制器请求?
在 Play 2 的 Java 风格中,有GlobalSettings.onRequest,可用于拦截所有传入控制器的请求。但是在等效的 Scala中,没有 onRequest 处理程序。
我怀疑这是因为 Java 中需要的动作委托逻辑在 Scala 中是不需要的,但这很烦人,因为我想在每个传入的控制器请求上运行一些代码。
有谁知道如何在 Scala + Play 2 应用程序中拦截所有控制器请求?
def onRouteRequest (request: RequestHeader): Option[Handler]
在您的Global 对象中覆盖可能是您正在寻找的答案。
从 2.0.4 api 开始,它在收到 HTTP 请求时调用。
您可以使用动作组合。来自 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