我从Setting HTTP headers in Play 2.0 (scala)?了解到,您可以通过执行Ok("hello").withHeaders(PRAGMA -> "no-cache")
等操作,在逐个案例的基础上设置响应头。
如果您希望在所有操作的响应上设置该标头或几个不同的标头,该怎么办?您不会想要到处重复withHeaders
。由于这更像是应用程序范围的配置,您可能不希望操作编写器必须使用不同的语法来获取标头(例如OkWithHeaders(...)
)
我现在拥有的是一个基本的Controller类,如下所示
class ContextController extends Controller {
...
def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache")
}
但这感觉不太对劲。感觉应该有更多AOP风格的方式来定义缺省头部,并将它们添加到每个响应中。
发布于 2012-07-30 15:02:11
在您的Global.scala
中,将每个调用包装在一个操作中:
import play.api._
import play.api.mvc._
import play.api.Play.current
import play.api.http.HeaderNames._
object Global extends GlobalSettings {
def NoCache[A](action: Action[A]): Action[A] = Action(action.parser) { request =>
action(request) match {
case s: SimpleResult[_] => s.withHeaders(PRAGMA -> "no-cache")
case result => result
}
}
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
if (Play.isDev) {
super.onRouteRequest(request).map {
case action: Action[_] => NoCache(action)
case other => other
}
} else {
super.onRouteRequest(request)
}
}
}
在本例中,我只在dev模式下调用操作,这对无缓存指令最有意义。
发布于 2013-02-15 21:54:39
这个话题现在已经很老了,但是在Play 2.1中,它现在更简单了。您的Global.scala
类应该如下所示:
import play.api._
import play.api.mvc._
import play.api.http.HeaderNames._
/**
* Global application settings.
*/
object Global extends GlobalSettings {
/**
* Global action composition.
*/
override def doFilter(action: EssentialAction): EssentialAction = EssentialAction { request =>
action.apply(request).map(_.withHeaders(
PRAGMA -> "no-cache"
))
}
}
发布于 2012-12-15 17:38:36
实现细粒度控制的最简单方法是使用包装的操作。在您的例子中,它可能是这样的:
object HeaderWriter {
def apply(f: Request[AnyContent] => SimpleResult):Action[AnyContent] = {
Action { request =>
f(request).withHeaders(PRAGMA -> "no-cache")
}
}
}
并以这种方式使用它:
def doAction = HeaderWriter { request =>
... do any stuff your want ...
Ok("Thats it!")
}
https://stackoverflow.com/questions/11479424
复制相似问题