JavaSer/javadrive/session

Last-modified: 2010-10-15 (金) 18:06:39

クッキーの保存について

 下記のようにすれば、クライアントに(クッキー受け付け状態ならば)
 クッキーが保存される。
 Cookie cookie = new Cookie("visited", "1");
response.addCookie(cookie);

クッキーの取得について

 Cookie cookie[] = request.getCookies();

 で取得可能
 取得したCookieクラスのオブジェクトの配列の中から、
 特定のクッキー名を持つクッキーを探すにはクッキー名を1つ1つ調べるしかない
 「Cookie」クラスで用意されている"getName"メソッドを使う。


if (cookie != null){
for (int i = 0 ; i < cookie.length ; i++){
if (cookie[i].getName().equals("visited")){
String val = cookie[i].getValue();
}
}

クッキーの値の再設定について

 クッキーを取得した後、
 CookieクラスのsetValueメソッドで値の設定が可能

クッキーの有効期限について

 デフォルトでは、クッキーはブラウザを閉じたら破棄されてしまう。

 cookie.setMaxAge(3600);

 のようにして、setMaxAgeメソッドで有効期限を設定する。
 単位は秒で、上記の例では1時間の有効期限となる。

 引数に0を設定するとクッキーが破棄される。
 引数にマイナスを設定すると、デフォルトと同じになる。

セッションとクッキーの違い

 セッションは必要な情報をクライアントではなく、サーバー側に保存する
 そのため、セキュアに利用できる。

 セッションはクライアント毎に作成され、識別IDや保存したい値を
 セッション変数としてサーバー側に保存する。

セッションの開始

 HttpSession session = request.getSession(true);

 trueを指定すると、セッションがすでに開始されていればそのセッションを返し、
 開始されてなければ新規にセッションを作成する。
 falseを指定するとセッションが存在しない場合はnullを返す。

セッションの書き込みと読み込み

 session.setAttribute("visited", "1");

 保存するデータの「名前」と「値」をセットで登録する
 名前はString型で、値はObject型である。
 値はObject型のサブクラスなら、なんでも登録できる(intなどの基本型は不可)

 読み込みは、取得したセッションに対して、getAttribute("名前")を実行する。
 値は(String)などでキャストして取得する

セッションに登録されているすべてのセッションオブジェクトを取得する方法

Enumeration enum_session = session.getAttributeNames();

  
  各オブジェクトに対して処理を行う場合は以下のようにする。


while(enum_session.hasMoreElements()) {
String key = (String)enum_session.nextElement();
String val = (String)session.getAttribute(key);

out.println(key + " = " + val + "<br>");
}

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

 
 session.removeAttribute("名前")
 #セッションの中で保存されている、「名前」と「値」の組みを削除する

セッションの破棄

 session.invalidate();

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

 セッション作成日時は以下のように取得する
long createTime = session.getCreationTime();

 ただし、1/1/1970 GMT からの経過秒数を表すlong型の値なので、
 以下のようにして、変換して使う

Date createDate = new Date(createTime);

 最後にアクセスした日時は下記のように取得する。
 long accessTime = session.getLastAccessedTime();

 これも、1/1/1970 GMT からの経過秒数を表すlong型の値である。

セッションの有効期限

 getMaxInactiveInterval()で取得可能
 クッキーの時と同じく、戻り値はint型で単位は秒
 デフォルトは30分(1800秒)

 setMaxInactiveInterval()で設定することが可能

 web.xmlから以下のように設定することもできる。 
 <web-app>
 <session-config>
 <session-timeout>
 有効期限の分数
 </session-timeout>
 </session-config>
 </web-app>

 

セッションIDの確認

 取得したセッションに対して
  session.getId()
 を実行することで取得できる。

 また、セッションを開始するとクッキーが保存される。
 #クッキーのクッキー名は「JSESSIONID」となる 

クッキーが使えないクライアントに対するセッション

 クッキーが使えないクライアントからでもセッションを利用できるようにするためには
 URLをセッションID付きのものに書き換える必要がある。

 クッキーが使える場合に、クライアントからはサーブレットへのリクエストと
 同時に自分が持っているクッキーをサーバに送ってくる。
 その仕組みの変わりに、サーブレットへのリクエストそのものにセッションIDを含めてしまうということになる。

 URLに付加するセッションIDは、クライアント毎・セッション毎に異なるため、固定して記述することは出来ない。
 まずクライアントが最初にサーバへアクセスした時にセッションを開始し、
 そこからセッションIDを取得した上で、それ以降クリックされる全てのURLに
 セッションIDを付与した形でHTMLをサーブレットが出力する必要がある。

 このセッションID付きのURLの生成は、「HttpServletResponse」インターフェースで
 定義されている"encodeURL"メソッドを使うことで自動的に行うことができる

String eURL = response.encodeURL("/session/sessiontest");

 またこのメソッドは、必要無ければ書き換えを行わない。
 つまりクッキーが使える状態で、クッキーからセッションIDを取得出来る場合には
 このメソッドを使ってもセッションIDの付与は行われない

 URL書き換えはクッキーが使えないクライアントでもセッションを
 利用できるようになり便利なのですが、URL自体にセッションIDを記述してしまうと
 セッションIDがそのままログなどにも残ってしまいセキュリティ上問題がある。
 その為、この方法は推奨はされておらずあくまでクッキー利用を前提にしたほうが良い

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

 クッキー経由の場合には"isRequestedSessionIdFromCookie"がTRUEを、
 URL書き換え経由の場合には"isRequestedSessionIdFromURL"がTRUEを返す

 boolean cookie_flag = request.isRequestedSessionIdFromCookie();
 boolean url_flag = request.isRequestedSessionIdFromURL();