在Play 2的Java风格中,有GlobalSettings.onRequest,可用于拦截所有对控制器的传入请求。但是在Scala equivalent中,没有onRequest处理程序。
我怀疑这是因为Scala中不需要Java中需要的Action委托逻辑,但它相当烦人,因为我想在每个传入的控制器请求上运行一些代码。
有没有人知道如何拦截Scala + Play 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