- 4.1. クッキー
- 4.2. セッション
- 4.3. セッションの終了
- 4.4. クッキーを用いないセッションIDの管理
4.2. セッション
クッキーは1つ1つの通信が独立しているHTTPプロトコルに、セッションの概念を導入する際によく利用します。しかし最近はセキュリティのためにクッキーの利用を制限している場合がありますし、またi-modeのような携帯端末ではクッキーの機能そのものが使えない場合が多々あります。そこでサーブレットには、サーバサイドでクライアントのセッション情報を管理する仕組みが提供されています。
上図はサーブレットにおけるセッション管理の方法を説明した図です。サーブレットはHttpServletRequestの「getSession」メソッドにより、セッションを開始する事ができます。このメソッドは「javax.servlet.http.HttpSession」オブジェクトを作成する(または取得)メソッドで、これを用いてセッションにおける情報の管理を行います。
「HttpSession」オブジェクトは一意なセッションIDによってサーブレットコンテナで管理されます。HttpSessionオブジェクトが作成されると、クライアントに対してセッションIDを保持するよう応答が返されます。セッションIDはデフォルトでは、クッキーに保存するようにされていますが、クッキー以外の方法で管理する事も可能です。その方法については4節で説明します。
クライアントはこのセッションIDを送ることにより、サーバは一連のセッションであると認識する事ができます。セッションIDと共に何らかの情報が送られてくると、それをHttpSessionオブジェクトを用いてサーバサイドで管理する事ができます。例えば、あるシステムに会員がログインすると、その会員の情報を一連のセッションで保持しつづける事が可能になります。無論、HttpSessionオブジェクトを作成した直後、セッションIDを応答する前に、何らかの情報をサーバサイドに保存する事も可能です。
以下はHttpSessionでユーザIDを管理するプログラムです。
public final class SessionSampleServlet extends HttpServlet{ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ HttpSession session=request.getSession(true); String id; if(session.isNew()){ id=request.getParameter("id"); session.setAttribute("id",id); }else{ id=(String)session.getAttribute("id"); } ... } }
HttpServletRequestの「getSession」メソッドでHttpSessionオブジェクトを生成・取得します(4行目)。引数にtrueを指定すると、セッションが確立されていなかった場合は新たにセッションを生成し、確立されていた場合には現在のセッションを返します。falseを指定すると、セッションが確立されていなかった場合にはnullを返します。引数を指定しないgetSessionメソッドは、引数にtrueを指定した場合と同じ挙動をします。
6行目の「isNew」メソッドは、セッションが作成されたところで、まだクライアントがセッションIDを知らない状態(図の2と3の間の状態)の場合に「true」を返します。その場合、まだユーザIDはサーバに保持されていないので、パラメータを読み取り「setAttribute」メソッドでその情報を保存します(8行目)。HttpSessionは「java.util.HashMap」「java.util.Hashtable」と同じで、文字列に関連付けてオブジェクトを管理します。ですから1つの文字列に対して、1つのオブジェクトしか関連付ける事ができません。同じ文字列を指定した場合は、後のオブジェクトで上書きされます。
isNewメソッドがfalseを返す場合(既にセッションは確立済みである場合)、ユーザIDはサーバサイドに保持されているはずなので、その情報を「getAttribute」メソッドで取得します(10行目)。
このサンプルでは使用していませんが、「removeAttribute」で保存している情報の削除を行う事ができます。
(実習課題2)
課題1のサーブレットプログラムを改良する事。
- カウンタの情報の管理にクッキーではなく、セッションを使用すること。