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

sik*_*iki 5 playframework playframework-2.2

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

到目前为止,基于,我尝试了以下内容:

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
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为没有匹配Action [_].

非常感谢所有的帮助!

tmb*_*mbo 4

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

\n\n
import play.api._\nimport play.api.mvc._\nimport play.api.Play.current\nimport play.api.http.HeaderNames._\n\nobject Global extends GlobalSettings {\n\n  def NoCache(action: EssentialAction): EssentialAction = EssentialAction { request =>\n    action(request).map(_.withHeaders(PRAGMA -> "no-cache"))\n  }\n\n  override def onRouteRequest(request: RequestHeader): Option[Handler] = {\n    if (Play.isDev) {\n      super.onRouteRequest(request).map { handler =>\n        handler match {\n          case a: EssentialAction => NoCache(a)\n          case other => other\n        }\n      }\n    } else {\n      super.onRouteRequest(request)\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该代码是从您所引用的问题移植而来的,该问题针对的是以前的 playframework 版本。

\n\n

从 playframework 2.1 开始,您还可以使用doFilter代替onRouteRequest来实现相同的目的:

\n\n
override def doFilter(action: EssentialAction) = EssentialAction { request =>\n  if (Play.isDev) {\n    action(request).map(_.withHeaders(\n      PRAGMA -> "no-cache"\n    ))\n  } else {\n    action(request) \n\xc2\xa0 }\n}\n
Run Code Online (Sandbox Code Playgroud)\n