セッション管理

セッションの開始

"getSession"メソッドは、サーブレットを要求してきたクライアントに対してセッションが既に開始されていればそのセッションを返す。
引数に"ture"を指定した場合、セッションが開始されていなければ新規にセッションを開始した後でそのセッションを返す。
引数に"false"を指定した場合、セッションが存在しない場合にはnullを返す。
HttpSession session = request.getSession(true);
URL http://localhost:8080/session/sessiontest
アプリケーション配置場所 c:\servlet-sample\session\
web.xmlファイル c:\servlet-sample\session\WEB-INF\web.xml
コンテキストファイル C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\session.xml

セッションを使ったデータの書き込みと読み込み

"setAttribute"メソッドは、保存するデータを「名前」と「値」のペアで登録する。
HttpSession session = request.getSession(true);
session.setAttribute("visited", "1");
既に保存されているセッションオブジェクトを取り出して読み込むためには、「HttpSession」インターフェースで定義されている"getAttribute"メソッドを使う。
String visitedStr = (String)session.getAttribute("visited");
URL http://localhost:8080/session/sessiontest

セッションオブジェクトの削除

"removeAttribute"メソッドは、引数に指定した「名前」のセッションオブジェクト削除する。
HttpSession session = request.getSession(true);
session.removeAttribute("visited");
URL(セッション開始) http://localhost:8080/session/sessiontest
  (オブジェクト削除) http://localhost:8080/session/deleteobject

セッションの破棄

セッションを破棄するには「HttpSession」インターフェースで定義されている"invalidate"メソッドを使う。
HttpSession session = request.getSession(true);
session.invalidate();
URL(セッション開始) http://localhost:8080/session/sessiontest
  (セッション破棄) http://localhost:8080/session/invalidatesession

セッション作成日時と最終アクセス日時

セッションの作成日時を取得するには「HttpSession」インターフェースで定義されている"getCreationTime"メソッドを使う。
取得した値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
HttpSession session = request.getSession(true);
long createTime = session.getCreationTime();
Date createDate = new Date(createTime);
  • 最終アクセス日時の取得
「HttpSession」インターフェースで定義されている"getLastAccessedTime"メソッドを使う。
戻り値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
URL http://localhost:8080/session/sessiontest

セッションの有効期限

セッションの有効期限を取得するには「HttpSession」インターフェースで定義されている"getMaxInactiveInterval"メソッドを使う。
取得した値はint型の値となっており単位は秒数。
URL http://localhost:8080/session/sessiontest
  • <session-config>要素による有効期限の設定
全てのセッションのデフォルトの有効期限を設定するには、web.xmlにて<session-config>要素を使って指定する。
<web-app>
  <session-config>
    <session-timeout>
      有効期限の分数
    </session-timeout>
  </session-config>
</web-app>
デフォルトのセッションの有効期限ではなく、個別のセッションに対する有効期限を設定するには「HttpSession」インターフェースで定義されている"setMaxInactiveInterval"メソッドを使う。
URL http://localhost:8080/session/sessiontest

セッションIDの確認

セッションIDを取得するには「HttpSession」インターフェースで定義されている"getId"メソッドを使う。
URL http://localhost:8080/session/sessiontest

URL書き換え

※URL書き換えはクッキーが使えないクライアントでもセッションを利用できるようになり便利だが、URL自体にセッションIDを記述してしまうとセッションIDがそのままログなどにも残ってしまいセキュリティ上問題がある。その為、この方法は推奨はされておらずあくまでクッキー利用を前提にしたほうが良い。
http://localhost:8080/session/sessiontest;jsessionid=(セッションID)
このようにセッションID付きのURLをクリックするなどしてサーバへリクエストを送ると、サーバ側ではそこからセッションIDを抜き出してクッキーがある場合と同じような処理をします。
このセッションID付きのURLの生成は、「HttpServletResponse」インターフェースで定義されている"encodeURL"メソッドを使うことで自動的に行うことができる。
このメソッドは引数にURLを表す文字列を指定して実行すると、セッションID付きのURLに変換して出力する。
HttpSession session = request.getSession(true);
out.println("<a href=\"/session/sessiontest\">再表示</a>");
 ↓
HttpSession session = request.getSession(true);
String eURL = response.encodeURL("/session/sessiontest");
out.println("<a href=\"" + eURL + "\">再表示</a>");

クッキーかURL書き換えかの判別

セッションを管理するためのセッションIDの取得についてクッキー経由かURL書き換えによるものか二通りの方式があるが、どちらの方式で利用されているかを判別することができる。判別することによってクッキー経由でのみサーブレットを利用させるなどの制限を行うことができる。
判別するには「HttpServletResponse」インターフェースで定義されている"isRequestedSessionIdFromCookie"メソッドと"isRequestedSessionIdFromUrl"メソッドを使う。
クッキー経由の場合には"isRequestedSessionIdFromCookie"がTRUEを、URL書き換え経由の場合には"isRequestedSessionIdFromURL"がTRUEを返す。
boolean cookie_flag = request.isRequestedSessionIdFromCookie();
boolean url_flag = request.isRequestedSessionIdFromURL();
最終更新:2009年02月28日 23:14