§Session と Flash スコープ
§Play における Session と Flash スコープ
複数のリクエストにまたがってデータを保持したい場合、Session または Flash スコープにデータを保存することができます。一旦 Session に保存されたデータは、ユーザの 1 セッション中ずっと保持され、Flash スコープに保存されたデータは 次のリクエストまで 保持されます。
Session や Flash のデータはサーバに保存されるのではなく、クッキーを利用して後続のリクエストに追加されることを理解するのは大切なことです。これは、データサイズがかなり制限される (4KB まで) と同時に、文字列型の値しか保存できないということを意味します。デフォルトのクッキー名は PLAY_SESSION
です。これは application.conf 内にある session.cookieName
キーの設定で変更することができます。
クッキーの名前を変更した場合は、cookie の設定と破棄 に記述されているものと同じメソッドを使って、以前のクッキーを破棄することができます。
もちろん、クッキーの値は秘密鍵によって署名されているため、クライアントがクッキーのデータを変更することはできません (変更すると、値が無効化されます) 。
Play の Session はキャッシュとして使われることを想定して作られてはいません。もし特定の Session に関するデータをキャッシュしたい場合、Play に組み込まれたキャッシュ機構を使ってユーザの Session にユニーク ID を保存して、キャッシュを特定のユーザに対応づけることができます。
デフォルトでは、Session に技術的なタイムアウトは存在しません。Session は、ユーザが web ブラウザを終了させたときに切れます。もし、特定のアプリケーションでタイムアウトの機能が必要になった場合は、ユーザの Session にタイムスタンプを保存して、必要なところで参照すると良いでしょう (例えば、セッションの最長期間、期限切れまでに許される無操作時間等) 。また、
session.maxAge
(ミリ秒単位) をapplication.conf
で設定することで、セッションクッキーの最大経過時間を設定することもできます。
§Session への値の保存
Session はただのクッキーであると同時に、ただの HTTP ヘッダでもあります。したがって、Result の他のプロパティを操作するのと同様の方法で、セッションデータを操作することができます。
Ok("Welcome!").withSession(
"connected" -> "[email protected]")
このコードはセッションを丸ごと入れ替えてしまうことに注意してください。もし、既存の Session に要素を追加する必要がある場合、受けとったセッションに要素を追加したものを新たなセッションとして指定してください。
Ok("Hello World!").withSession(
request.session + ("saidHello" -> "yes"))
同じ方法で、受け取ったセッション中の値を削除することができます。
Ok("Theme reset!").withSession(
request.session - "theme")
§Session の値の読み込み
次のように、送信されてきた Session を HTTP リクエストから取り出すことができます。
def index = Action { request =>
request.session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
§セッションの破棄
セッション全体を破棄するために、特別な操作が用意されています。
Ok("Bye").withNewSession
§Flash スコープ
Flash スコープは次の 2 点の違いを除いて、Session と全く同じように動作します。
- データは 1 リクエストまで保持されます
- フラッシュ向けのクッキーは署名されていないため、ユーザによって変更される可能性があります
重要: Flash スコープはシンプルかつ非 Ajax なアプリケーションにおいて、成功/失敗メッセージをやり取りするためだけに利用すべきです。データは次のリクエストまでしか保持されず、また複雑な Web アプリケーションにおいてはリクエストの順序が保証できないため、Flash スコープが競合状態に陥る可能性があります。
次に Flash スコープの利用例をいくつか示します。
def index = Action { implicit request =>
Ok {
request.flash.get("success").getOrElse("Welcome!")
}
}
def save = Action {
Redirect("/home").flashing(
"success" -> "The item has been created")
}
Flash スコープの値をビューから取得するには、暗黙の Flash パラメータを追加します。
@()(implicit flash: Flash)
...
@flash.get("success").getOrElse("Welcome!")
...
そして以下に示すようにアクションの中で implicit request =>
を指定してください。
def index = Action { implicit request =>
Ok(views.html.index())
}
暗黙のリクエストに基づいて暗黙の Flash がビューに提供されます。
アクションがスコープ内で暗黙のリクエストを持たなかった場合、‘could not find implicit value for parameter flash: play.api.mvc.Flash’ というエラーが発生します。
Next: ボディパーサー
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。