§セッションとフラッシュスコープ
§Play におけるセッションとフラッシュスコープ
複数のリクエストにまたがってデータを保持したい場合、セッションまたはフラッシュスコープにデータを保存することができます。一旦セッションに保存されたデータは、ユーザの 1 セッション中ずっと保持され、フラッシュスコープに保存されたデータは次のリクエストまで保持されます。
セッションやフラッシュのデータはサーバに保存されるのではなく、クッキーを利用して後続のリクエストに追加されるということはとても重要です。このことは、データサイズがかなり制限される (4KB まで) と同時に、文字列型の値しか保存できないということを意味します。
クッキーの値は秘密鍵によって署名されているため、クライアントがクッキーのデータを変更することはできません (変更すると、値が無効化されます) 。Play のセッションはキャッシュとして使われることを想定して作られてはいません。もし、特定のセッションに関するデータをキャッシュしたい場合、Play に組み込まれたキャッシュ機構を利用し、そしてキャッシュされたデータを特定のユーザに対応付けるユニークな ID をセッションに格納することができます。
このセッションに技術的なタイムアウトは存在せず、ユーザが web ブラウザを閉じると失効します。特定のアプリケーション用にタイムアウト機能が必要な場合は、ユーザセッションにタイムスタンプを格納して、アプリケーションが望むように利用してください (例えば、セッションの最大期間や、活動していない最小期間など)
§セッションへの値の保存
セッションはただのクッキーであると同時に、ただの HTTP ヘッダでもあります。しかし、Play はセッションの値を格納するためのヘルパーメソッドを提供しています。
public Result login() {
session("connected", "[email protected]");
return ok("Welcome!");
}
同じ方法で、受け取ったセッション中の値を削除することができます。
public Result logout() {
session().remove("connected");
return ok("Bye");
}
§セッション値の読み込み
次のように、送信されてきたセッションを HTTP リクエストから取り出すことができます。
public Result index() {
String user = session("connected");
if(user != null) {
return ok("Hello " + user);
} else {
return unauthorized("Oops, you are not connected");
}
}
§セッションの破棄
セッション全体を破棄する場合は、特別な操作が用意されています。
public Result logout() {
session().clear();
return ok("Bye");
}
§フラッシュスコープ
フラッシュスコープは次の 2 点の違いを除いて、セッションと全く同じように動作します。
- データは 1 リクエストまで保持されます
- フラッシュ向けのクッキーは署名されていないため、ユーザによって変更される可能性があります
重要: フラッシュスコープはシンプルかつ非 Ajax なアプリケーションにおいて、成功/失敗メッセージをやり取りするためだけに利用すべきです。その理由は、データが次のリクエストまでしか保持されない、また複雑な Web アプリケーションにおいてはリクエストの順序が保証できないためにフラッシュスコープが競合状態に陥る可能性があるからです。
例えば、アイテムを保存した後、ユーザを index ページにリダイレクトさせて、この index ページに保存処理が成功したことを示す通知を表示したいとします。この場合、save アクションで flash スコープに処理成功メッセージを追加します:
public Result save() {
flash("success", "The item has been created");
return redirect("/home");
}
その後、index アクションにおいて flash スコープ内に成功メッセージが存在するか確認し、存在する場合はレンダリングします:
public Result index() {
String message = flash("success");
if(message == null) {
message = "Welcome!";
}
return ok(message);
}
flash の値は自動的に Twirl テンプレートから利用できます。例:
@if(flash.containsKey("success")) {
@flash.get("success")
} else {
Welcome!
}
Next: ボディパーサー
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。