我从Setting HTTP headers in Play 2.0 (scala)?知道,您可以通过例如Ok("hello").withHeaders(PRAGMA -> "no-cache")逐个设置响应头。

如果要在所有操作的响应上设置该标头或几个其他标头,该怎么办?您不想在任何地方重复withHeaders。而且由于这更像是应用程序范围的配置,因此您可能不希望Action编写器必须使用其他语法来获取标头(例如OkWithHeaders(...)

我现在拥有的是一个基本的Controller类,看起来像

class ContextController extends Controller {
 ...
 def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache")
}


但这感觉并不对。感觉应该有更多的AOP样式的方式来定义默认标头,并将其添加到每个响应中。

最佳答案

在您的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模式下调用该动作,这对于无缓存指令最有意义。

09-25 22:56