使用Play中的自定义处理程序覆盖onRouteRequest!斯卡拉

时间:2013-12-12 01:21:52

标签: playframework playframework-2.2

我正在使用Play 2.2.1并尝试覆盖GlobalSettings中的onRouteRequest函数。我在网上找到的所有示例都适用于Play 2.2.x之前,它们似乎不适用于2.2.x.基本上想要在响应头中为所有响应设置一些自定义内容。

到目前为止,我已根据this:

尝试了以下内容
object Global extends GlobalSettings {

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    super.onRouteRequest(request).map { handler =>
      handler match {
        case a: Action[_] => CustomAction(a)
        case _            => handler
      }
    }
  }

然而,这不起作用,因为没有任何东西与Action [_]匹配。

提前感谢所有的帮助!

1 个答案:

答案 0 :(得分:4)

您需要匹配EssentialAction而不是Action。这是一个示例,显示如何为playframework 2.2中的每个请求将“pragma”标头设置为“no-cache”

import play.api._
import play.api.mvc._
import play.api.Play.current
import play.api.http.HeaderNames._

object Global extends GlobalSettings {

  def NoCache(action: EssentialAction): EssentialAction = EssentialAction { request =>
    action(request).map(_.withHeaders(PRAGMA -> "no-cache"))
  }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    if (Play.isDev) {
      super.onRouteRequest(request).map { handler =>
        handler match {
          case a: EssentialAction => NoCache(a)
          case other => other
        }
      }
    } else {
      super.onRouteRequest(request)
    }
  }
}

代码移植自您引用的问题,该问题针对之前的playframework版本。

自playframework 2.1起,你也可以使用doFilter代替onRouteRequest来实现相同目标:

override def doFilter(action: EssentialAction) = EssentialAction { request =>
  if (Play.isDev) {
    action(request).map(_.withHeaders(
      PRAGMA -> "no-cache"
    ))
  } else {
    action(request) 
  }
}