2012-07-13 13 views
17

私はSetting HTTP headers in Play 2.0 (scala)?から、Ok("hello").withHeaders(PRAGMA -> "no-cache")のように、ケースバイケースで応答ヘッダーを設定できることを認識しています。再生2 - すべての応答にヘッダーを設定しますか?

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

私は今、

のような基本コントローラクラスです
class ContextController extends Controller { 
... 
def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache") 
} 

しかし、それほど正しいとは感じません。デフォルトのヘッダを定義し、それを各レスポンスに追加するというAOPスタイルの方法が増えるはずです。

+1

注: あなたGlobal.scalaクラスは、次のようになります。このリンクを参照してください:http://www.mnot.net/cache_docs/おそらく、PRAGMA – andrewf

+0

の代わりにCACHE_CONTROLを使用することをお勧めします。 'CACHE_CONTROL - >" max-age = 0 "'それを行うべきです。 – andrewf

答えて

8

、アクションですべての呼び出しをラップ:

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モード、でアクションを呼び出します。

+0

素敵な、ありがとう!私は似たような解決策を見つけ出しましたが、パラメータ化された型SimpleResultに、消去に関するコンパイラの警告を付けずに問題を抱えていました。また、PRAGMAがキャッシュに使用するのが間違っているという上記の私のコメントに注意してください。 – andrewf

+0

これは私にとって良い反応のようです! – gimix

+0

@MariusSoutier - あなたが提案した解決策を試しましたが、実行時には、常に他の_を取得し、ヘッダーを追加するために使用できる 'Action'ではありません。実行時の_ "other" _のタイプは、 'play.core.Router $ Routes $$ anon $ 4'です。どのように対処できるのでしょうか?私の前のコメントに関しては –

0

あまりにも方法があります。 action-compositionを使用できます。次に、ヘッダーをここに設定することを各コントローラーで宣言する必要があります。もう1つの方法は、GlobalSettingsを使用することです。 javaにも同様のソリューションがあります。あなたのGlobal.scala

+0

GlobalSettingsでこれをどこで行うことができるのか分かりませんが、もっと具体的にできますか?それは、あなたがリクエストにフックしか持たず、レスポンスではないように見えます。 –

+0

あなたは通常のアクションを自分でラップすることができます。そして結果オブジェクトへのアクセス権があると思います。ちょうどアイデア、私はJavaで働いているので。そこにあなたは応答を含む文脈を持っています。 – niels

2

細かい制御を実現する最も簡単な方法は、ラップされたアクションを使用することです。あなたのケースでは、それはそのようなものになることができます。

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!") 
} 
14

話題は今かなり古いですが、プレイ2.1でそれは今でも簡単です。 >キャッシュなし、おそらくあなたは予定のように動作しません - プラグマがあること

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" 
    )) 
    } 
} 
関連する問題