Locked History Actions

Play/Session

セッション管理

セッション管理については特にscala版の特記事項は無い模様。つまり、Java版と同じらしい。 また、セッションをキャッシュとして使わないよう、playはキャッシュ機構を備えている。

フラッシュスコープとは

いきなりフラッシュスコープという耳慣れない言葉が出てくるが、以下に参考を示す。

例えば、フォームをサブミットし、その内容がエラーだった場合、エラーページにリダイレクトするが、その際のメッセージをエラーページに受け渡すためには、以下のいずれかを行わなければならない。

  • エラーメッセージをパラメータとして受け渡す。
  • エラーメッセージをセッションに保存し、エラーページにて表示した後にそれを消す。

フラッシュスコープを利用すると以下のような動作になるようだ。

  • エラー内容をフラッシュスコープに保存する
  • エラーページにリダイレクトする
  • エラーページでエラー内容を表示する
  • フラッシュスコープの内容は自動的に消える

セッションの使い方

play.mvc.ScalaControllerには、以下のような定義がある。

    implicit def request = Request.current()
    implicit def response = Response.current()
    implicit def session = Session.current()
    implicit def flash = Flash.current()
    implicit def params = Params.current()
    implicit def renderArgs = RenderArgs.current()
    implicit def validation = Validation.current()

通常、コントローラは

object Application extends Controller {
    
    import views.Application._
    
    case class User(name: String, addr: String)
    
    def index() = html.index("Your Scala application is ready!")
}

などと記述されるが、このControllerは実はplay.mvc.packageにて「 type Controller = ScalaController」とされており、ScalaControllerのことになる。

つまり、上記コントローラコード中で、sessionを参照すると、これはSession.current()になる。Sessionは play.mvc.Scope.Sessionのこと。

おそらく、put(key: String, value: String)を呼び出せばセッションに名前付文字列を保持することができる。

キャッシュの利用

セッションには極めて小さな文字列しか保存できず、大きなデータやバイナリを保存するにはキャッシュを用いる必要がある。 ただし、ユーザごとに個別のセッション保持領域とは異なり、キャッシュはplay環境でグローバルであることに注意。 ユーザごと(セッションごと)の情報を保持するには、セッションのIDをキャッシュ用キーに含める必要がある。 もちろん、ユーザが識別できれば何でもよい。

※注意:Cacheというクラスは、実際にはScalaCacheを参照する(Controllerが実際にはScalaControllerであるように)。 例えばgetの戻り値がOption[T]となっているので注意しなければならない。

参考