§セッションとフラッシュスコープ
§Playにおける違い
複数のHTTPリクエストにわたってデータを保持する必要がある場合は、セッションまたはフラッシュスコープに保存できます。セッションに保存されたデータはユーザーセッション全体で使用でき、フラッシュスコープに保存されたデータは次のリクエストでのみ使用できます。
§Cookieの操作
セッションデータとフラッシュデータはサーバーに保存されず、HTTP Cookieを使用して後続の各HTTPリクエストに追加されることを理解することが重要です。
セッションとフラッシュはCookieを使用して実装されているため、いくつかの重要な影響があります。
- データサイズは非常に限られています(最大4KB)。
- JSONをCookieにシリアライズできますが、文字列値のみを保存できます。
- Cookieの情報はブラウザに表示されるため、機密データが公開される可能性があります。
- Cookieの情報は元のリクエストに対して不変であり、後続のリクエストでのみ使用できます。
最後の点は混乱の源になる可能性があります。Cookieを変更すると、レスポンスに情報を提供することになり、Playは更新された値を確認するために再度解析する必要があります。セッション情報が最新であることを確認したい場合は、常にセッションの変更とリダイレクトを組み合わせる必要があります。
セッションCookieは秘密鍵で署名されるため、クライアントはCookieデータを変更できません(変更すると無効になります)。
Playセッションはキャッシュとして使用する目的ではありません。特定のセッションに関連するデータをキャッシュする必要がある場合は、Playの組み込みキャッシュメカニズムを使用し、セッションを使用してキャッシュされたデータを特定のユーザーに関連付ける一意のIDを保存できます。
§セッションの設定
Cookieのデフォルト名はPLAY_SESSION
です。これは、`application.conf`でキー`play.http.session.cookieName`を設定することで変更できます。
Cookieの名前が変更された場合、Cookieの設定と破棄で説明されているのと同じ方法を使用して、以前のCookieを破棄できます。
`application.conf`でセッションCookieパラメータを設定する方法の詳細については、セッションCookieの設定を参照してください。
§セッションタイムアウト/有効期限
デフォルトでは、セッションに技術的なタイムアウトはありません。ユーザーがWebブラウザを閉じると期限切れになります。特定のアプリケーションで機能的なタイムアウトが必要な場合は、`application.conf`でキー`play.http.session.maxAge`を設定してセッションCookieの最大年齢を設定します。これにより、`play.http.session.jwt.expiresAfter`も同値に設定されます。`maxAge`プロパティはブラウザからCookieを削除し、JWTの`exp`クレームはCookieに設定され、指定された期間後に無効になります。詳細については、セッションCookieの設定を参照してください。
§セッションへのデータの保存
セッションはCookieであるため、HTTPヘッダーでもあります。しかし、Playはセッション値を保存するためのヘルパーメソッドを提供しています。
public Result login(Http.Request request) {
return redirect("/home")
.addingToSession(request, "connected", "[email protected]");
}
同じように、受信セッションから任意の値を削除できます。
public Result logout(Http.Request request) {
return redirect("/home").removingFromSession(request, "connected");
}
§セッション値の読み取り
HTTPリクエストから受信セッションを取得できます。
public Result index(Http.Request request) {
return request
.session()
.get("connected")
.map(user -> ok("Hello " + user))
.orElseGet(() -> unauthorized("Oops, you are not connected"));
}
§セッション全体の破棄
セッション全体を破棄する場合は、特別な操作があります。
public Result logout() {
return redirect("/home").withNewSession();
}
§フラッシュスコープ
フラッシュスコープはセッションとまったく同じように機能しますが、1つの違いがあります。
- データは1つのリクエストのみ保持されます。
重要:フラッシュスコープは、単純な非Ajaxアプリケーションでの成功/エラーメッセージの転送にのみ使用する必要があります。データは次のリクエストのみ保持され、複雑なWebアプリケーションではリクエスト順序が保証されないため、フラッシュスコープは競合状態の影響を受けます。
たとえば、アイテムを保存した後、ユーザーをインデックスページにリダイレクトし、保存が成功したことを示すメッセージをインデックスページに表示する場合があります。保存アクションでは、成功メッセージをフラッシュスコープに追加します。
public Result save() {
return redirect("/home").flashing("success", "The item has been created");
}
次に、インデックスアクションで成功メッセージがフラッシュスコープに存在するかどうかを確認し、存在する場合はレンダリングします。
public Result index(Http.Request request) {
return ok(request.flash().get("success").orElse("Welcome!"));
}
フラッシュ値はTwirlテンプレートでも自動的に使用できます。例:
@flash.get("success").orElse("Welcome!")
次へ:ボディパーサー
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に投稿してください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。