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