Playframework の セッションとかキャッシュ周り

相変わらず2pickシミュレータを作成中。

セッション周りとキャッシュ周り。

PlayFrameworkは基本的にセッションを自動で発行してくれてる(デフォルトでPLAY_SESSIONというcookie名)

だけど、Pickを開始するタイミングなり、最初の入口で一度リセットかけてセッションを再発行することで、前回の実行結果とかを引き継がないようにしたい

で、セッションを発行するときUUIDを使ってキャッシュもしておくということをしたい

セッションをはって、そのセッション内のデータをキャッシュしておくという使い方。

※ これが正しいかどうかは要検証。ひとまずはこれでやる

なので、これを参考に実行。 qiita.com

公式ドキュメント的にはこれwww.playframework.com

まずはbuild.sbtのlibraryDependenciesに以下を追加

  • ehcache
  • cacheApi

今回は同期したいのでplay.api.cache.SyncCacheApiを使う。

開始画面へクライアントがアクセスしたタイミングで一度セッションリセットをしたいのでこんな感じ

  def index() = Action { implicit request: Request[AnyContent] =>
    CacheUtil.deleteSessionUser(cache, request.session.get("sessionKey"))
    Ok(views.html.index()).withNewSession
  }

一度セッションクリアして、その上で新しいセッションを作成するようにして、次の画面で設定するということをする。

SyncCacheApiをInjectに失敗したりしていたが、build.sbtを見直したり、何度か sbt runをやり直してたら問題なくなった。

何がいけなかったのがそこだけわかっていない。

あと、テストの引数を追加する必要がある

※ Controllerの引数にキャッシュが追加されたので

こんな感じで追加

      val cache = app.injector.instanceOf[SyncCacheApi]
      val controller = new IndexController(cache, stubControllerComponents())

CSRFも少しハマったので次はその周りの話を書いていく