播放2 - 在所有回复中设置标题?

Ken*_*oka 18 scala playframework-2.0

我知道在Play 2.0(scala)中设置HTTP标头?例如,您可以根据具体情况设置响应标头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")
}
Run Code Online (Sandbox Code Playgroud)

但这感觉不太对劲.感觉应该有更多的AOP风格的方法来定义默认标头并将它们添加到每个响应中.

Bob*_*b G 14

这个话题现在很老了,但是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"
    ))
  }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ier 8

在你的操作中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)
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只在dev模式下调用该操作,这对于无缓存指令最有意义.