§セッションとフラッシュスコープ
§Playでの違い
複数のHTTPリクエストにまたがってデータを保持する必要がある場合は、セッションまたはフラッシュスコープに保存できます。セッションに保存されたデータはユーザーセッション全体で利用可能であり、フラッシュスコープに保存されたデータは次のリクエストでのみ利用可能です。
§クッキーの操作
セッションとフラッシュデータはサーバーに保存されるのではなく、HTTPクッキーを使用して後続の各HTTPリクエストに追加されることを理解することが重要です。
セッションとフラッシュはクッキーを使用して実装されているため、いくつかの重要な意味合いがあります。
- データサイズは非常に制限されています(最大4KB)。
- クッキーには文字列値のみを保存できますが、JSONをシリアライズしてクッキーに保存できます。
- クッキー内の情報はブラウザに表示されるため、機密データが公開される可能性があります。
- クッキー情報は元のリクエストに対して不変であり、後続のリクエストでのみ利用可能です。
最後の点は混乱の原因となる可能性があります。クッキーを変更すると、レスポンスに情報が提供され、Playは更新された値を確認するために再度解析する必要があります。セッション情報が最新であることを確認したい場合は、常にセッションの変更とリダイレクトを組み合わせる必要があります。
§セッション構成
クッキーのデフォルト名はPLAY_SESSION
です。これは、application.confでキーplay.http.session.cookieName
を構成することで変更できます。
クッキーの名前が変更された場合、以前のクッキーはクッキーの設定と破棄で言及されているのと同じ方法で破棄できます。
application.conf
でのセッションクッキーパラメータの構成方法の詳細については、セッションクッキーの構成を参照してください。
§セッションタイムアウト/有効期限
デフォルトでは、セッションに技術的なタイムアウトはありません。ユーザーがWebブラウザを閉じると有効期限が切れます。特定のアプリケーションに機能的なタイムアウトが必要な場合は、application.conf
でキーplay.http.session.maxAge
を構成してセッションクッキーの最大有効期間を設定できます。これにより、play.http.session.jwt.expiresAfter
も同じ値に設定されます。maxAge
プロパティはブラウザからクッキーを削除し、JWTのexp
クレームがクッキーに設定され、指定された期間後に無効になります。詳細については、セッションクッキーの構成を参照してください。
§セッションへのデータの保存
セッションは単なるクッキーであるため、HTTPヘッダーでもあります。他の結果プロパティを操作するのと同じ方法で、セッションデータを操作できます。
Redirect("/home").withSession("connected" -> "[email protected]")
これにより、セッション全体が置き換えられることに注意してください。既存のセッションに要素を追加する必要がある場合は、受信セッションに要素を追加し、それを新しいセッションとして指定してください。
Redirect("/home").withSession(request.session + ("saidHello" -> "yes"))
受信セッションから値を削除することも同じ方法で行えます。
Redirect("/home").withSession(request.session - "theme")
§セッション値の読み取り
HTTPリクエストから受信セッションを取得できます。
def index: Action[AnyContent] = Action { request =>
request.session
.get("connected")
.map { user => Ok("Hello " + user) }
.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
§セッション全体の破棄
セッション全体を破棄する特別な操作があります。
Redirect("/home").withNewSession
§フラッシュスコープ
フラッシュスコープはセッションとまったく同じように機能しますが、1つの違いがあります。
- データは1つのリクエストでのみ保持されます。
重要:フラッシュスコープは、単純な非Ajaxアプリケーションで成功/エラーメッセージを転送する場合にのみ使用する必要があります。データは次のリクエストでのみ保持され、複雑なWebアプリケーションでリクエスト順序を保証するものが存在しないため、フラッシュスコープは競合状態の影響を受けやすくなります。
フラッシュスコープを使用したい場合のいくつかの例を次に示します。
def index: Action[AnyContent] = Action { implicit request =>
Ok {
request.flash.get("success").getOrElse("Welcome!")
}
}
def save: Action[AnyContent] = Action {
Redirect("/home").flashing("success" -> "The item has been created")
}
ビューでフラッシュスコープの値を取得するには、暗黙的なフラッシュパラメータを追加します。
@()(implicit flash: Flash)
...
@flash.get("success").getOrElse("Welcome!")
...
アクションでは、以下に示すようにimplicit request =>
を指定します。
def index: Action[AnyContent] = Action { implicit request => Ok(views.html.index()) }
暗黙的なリクエストに基づいて、暗黙的なフラッシュがビューに提供されます。
エラー「パラメーターflash: play.api.mvc.Flashの暗黙的な値が見つかりませんでした」が発生した場合、これはアクションのスコープに暗黙的なリクエストがないためです。
次へ:ボディパーサー
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。 ドキュメントガイドラインを読んだ後、プルリクエストを自由に投稿してください。質問や共有するアドバイスはありますか? コミュニティフォーラムにアクセスして、コミュニティとの会話を始めましょう。