gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:34:12 26 4
gpt4 key购买 nike

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

到目前为止,我已经尝试了以下,基于 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[_] 匹配的内容。

非常感谢您提前提供的所有帮助!

最佳答案

您需要匹配 EssentialAction而不是 Action .这是一个示例,显示了如何为 playframework 2.2 中的每个请求将“pragma” header 设置为“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)
  }
}

关于playframework - 在 Play 中使用自定义处理程序覆盖 onRouteRequest!斯卡拉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com