第1章 クッキーとセッションを利用しよう
1.3 セッションを利用したデータの共有
Webアプリケーションでは、複数のページをまたいでデータを共有したい場合があります。そのようなときには、スコープの一種であるセッションと呼ばれる仕組みを利用します
1.3.1 セッションの動作を知ろう
JSPサーブレット単元では、Webアプリケーション内でデータを共有するリクエストスコープについて学習しました。セッションは、リクエストスコープと同じスコープの一種です。リクエストスコープは1ページを表示するまでの間有効なデータの保存領域だったのに対し、セッションは同じクライアント(Webブラウザ)からWebアプリケーションに接続されている間有効なデータの保存領域です。
例えば、ショッピングサイトで利用されるカート機能などは、複数の商品のページを遷移し、各商品の情報をずっと保持している必要があります。このような場合にセッションにデータを登録することで、他の画面に遷移してもデータを取り出し利用することができるのです。
セッションでは下の図のようにデータを共有することができます。
セッションはリクエストスコープより広い範囲でデータの共有を行うことができるため、全てセッションに登録すれば良いと思われる方もいるかもしれませんが、それは正しくありません。保持しておく必要のないデータまでセッションに登録しておくと、その分サーバーのリソースを消費してしまうからです。
登録するデータをいつまで保持しておく必要があるのかによって、2つのスコープをうまく使い分けることが重要になります。
1.3.2 セッションを利用するためのクラスとメソッド
セッションを利用する場合、javax.servlet.http.HttpSessionインタフェースのオブジェクトを利用します。ここのHttpSessionインタフェースのオブジェクトはHttpServletRequestインタフェースに定義された以下のメソッドを利用し取得します。
1.3.3 セッションを管理する仕組み
WebブラウザからWebアプリケーションにアクセスすると、自動的にセッションIDと呼ばれる一意のIDが発行されます。このセッションIDはセッションに登録されたデータに紐付けられるとともに、クッキーに保存されます。セッションIDが登録されたブラウザは、Webアプリケーションにアクセスする際にセッションIDを送信するため、サーバー側ではこのIDを確認することで一連のアクセスであることが認識できるようになります。
このクッキーに登録されたセッションIDとサーバー上のセッションデータの関係は次のようになります。
まず、プログラムにアクセスするとセッションIDが生成され、最初の画面の表示と同時にクッキーに登録されます。その際、サーバー上のセッションのデータにも同じセッションIDが紐付けられます。
2回目以降のアクセス時には、リクエストと一緒にサーバーに送信されたクッキー(セッションID)をもとに、セッションのデータを参照することができます。
クッキーに登録されたセッションIDの有効期限はブラウザを閉じるまでです。そのため、ブラウザが閉じられた(セッションが切れた)後のアクセスでは、クッキー内のセッションIDは無効となり、Webアプリケーションから新しいセッションIDが発行されます。そのため、古いセッションIDのデータは参照できなくなります。
このように、セッションはクッキーを利用される仕組みなのです。そのため、クッキーが無効になっている環境ではセッションも利用できないので、注意が必要です。
次の節ではセッションを利用したプログラムを作成していきます。