我正在使用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 [_]匹配。
提前感谢所有的帮助!
答案 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)
}
}