18

Play 2.0 (scala) で HTTP ヘッダーを設定することを知っていますか? たとえば、Ok("hello").withHeaders(PRAGMA -> "no-cache").

すべてのアクションからの応答に、そのヘッダーまたはいくつかの異なるヘッダーを設定したい場合はどうすればよいでしょうか? withHeadersどこでも繰り返したくないでしょう。また、これはアプリケーション全体の構成に似ているため、アクションの作成者がヘッダーを取得するために別の構文を使用する必要があることを望まない場合があります (例: OkWithHeaders(...))

私が今持っているのは、次のような基本コントローラークラスです

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

しかし、それはあまり正しくありません。デフォルトのヘッダーを定義し、それらを各応答に追加する AOP スタイルの方法がもっとあるはずです。

4

4 に答える 4

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"
    ))
  }
}
于 2013-02-15T13:54:38.540 に答える
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)
    }
  }

}

この場合、開発モードでのみアクションを呼び出します。これは、キャッシュなしの命令に最も適しています。

于 2012-07-30T07:02:11.453 に答える
3

きめ細かな制御を実現する最も簡単な方法は、ラップされたアクションを使用することです。あなたの場合、それは次のようなものです:

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!")
}
于 2012-12-15T09:38:36.297 に答える
0

方法がありすぎます。action-compositionを使用できます。次に、ここにヘッダーを設定するすべてのコントローラーで宣言する必要があります。別のオプションは、GlobalSettingsを使用することです。Javaにも同様のソリューションがあります。

于 2012-07-14T06:17:51.980 に答える