Webアプリのセッション管理について理解を深めよう

今日はセッション管理についてちょっと業務中に調べて知識を入れたので、忘れないうちに備忘録を残しておこうと思います!

セッションの利用

Webアプリケーションは、HTTPを使ってクライアントとサーバでデータのやり取りを行います。


HTTP自体には物理的にセッションを維持できない。


なので、セッションを識別できるようにセッションIDという値をクライアントとサーバで連携して、セッションを維持している。


クライアントとサーバの間でセッションIDの連携をする方法として、cookie(クッキー)かリクエストパラメータが使われる。


複数の画面を移動するときに、データを持ち回りしたい場合はそのデータをセッションに格納することで、画面間で持ちまわることができる。



セッションを利用することによるメリット・デメリット

セッションを使うことによるメリットとデメリットは下記の通りです。

  • メリット
  1. 画面間でデータを持ちまわることができるので、複数の画面で1つの処理をするという場合にデータの持ち回りが簡単
  2. セッションに格納しておくことによって、データを取得する処理の回数を減らせる
  • デメリット
  1. 同じ処理をする画面を、複数のタブやブラウザで開いてしまうと、それぞれの操作がセッション上のデータを干渉するので整合性を保てない
  2. セッションがアプリケーションサーバのメモリとして管理されるので、セッションで格納するデータが増えるほどメモリの増加量も増える
  3. データをセッションに格納することによって、APサーバの拡張性(スケーラビリティ)を低下させることになりえる

セッションを利用しないことによるメリット・デメリット

逆にセッションを使わないことによるメリットとデメリットは下記の通りです。

  • メリット
  1. サーバ側でデータを持たないことになるので、画面を複数のブラウザやタブで開かれてもデータを干渉しない。
  2. サーバ側でデータを持たないので、メモリの使用量を抑えることができる。
  • デメリット
  1. サーバ側の処理で必要となるデータをいちいちリクエストパラメータで取得といけない。画面に表示してない項目も、hiddenに指定しておく必要がある。これによりJSPの実装が増えてしまう
  2. サーバ側の処理で必要となるデータを、すべてリクエストで取得するので送信する時に、ネットワークに流れるデータが増える
  3. 画面を表示するのに必要なデータを毎回取得する必要があり、データ取得の処理が増えてしまう。

セッションに格納したオブジェクトの削除


セッションで格納したオブジェクトは、ほっておくとメモリ枯渇の要因になるので削除してあげる必要があります。


以下3つのケースでセッションのオブジェクトを削除しなければなりません。

  • 完了画面を表示する時のリクエス
  • 画面操作を途中で中止する時のリクエス
  • 入力画面を初期表示する時のリクエス

それぞれ理由を解説していきます。

完了画面を表示する時のリクエス

完了画面を表示してしまうと、セッションに格納したオブジェクトにアクセスすることがないので、いらないオブジェクトを削除する必要がある。

画面操作を途中で中止する時のリクエス

画面操作を途中で中止する時も、セッションに格納したオブジェクトにアクセスすることはありません。


不要なオブジェクトを削除する必要があります。

入力画面を初期表示する時のリクエス

登録画面などの入力できる画面での入力情報はセッションに格納されているフォームに残ります。


再度画面を表示する時に、セッションに残っている情報から画面に表示されてしまいます。


なので初期表示する時にはセッションを削除しておく必要があります。

どうやって削除するのか?

@SessionAttributesでセッションに格納したオブジェクトを削除したいという時は、SessionStatusクラスのsetCompleteというメソッドを
Controllerの処理から呼び出します。

setCompleteメソッドを実行すると@SessionAttributesアノテーションの属性値に指定しているオブジェクトがセッションから削除されます。

↓Springのアノテーションについてはこちらの記事でまとめています↓
www.engineer-wataru.com