セッション管理

セッション管理とはページ遷移する時に同一のclientであるかを認識するために使う。
たとえば、ログインしてから処理を行うショッピングサイトなどがその例。
ただしセッション管理は非常にナイーブな処理なので、脆弱性対応はきちんとしておかないとダメ。
cookieで管理するため、使えない環境(モバイルとか?)などはURLパラメータで管理することも。


セッション管理の手順
  1. clientがservletにアクセス。セッションIDが生成。
  2. 生成されたセッションIDはclientに返却。client側で保存。
  3. clientから再度requestされる時に、一緒にservletへわたる。
  4. servlet側で、セッションIDから同一clientか判断。
セッション管理に関連するmethod
戻り型 method 説明
HttpSession getSeesion() HttpServletRequestインタフェースで定義されているメソッド。セッションオブジェクト(セッションID)を返却。セッションオブジェクトが生成されていない場合は、セッションオブジェクトを生成して返却。
Object getAttribute(String) HttpSessionインターフェースで定義されてるメソッド。引数に指定されたデータ名に該当するセッションスコープのデータ値を返却。ない場合はnull。
void setAttribute(String,Object) HttpSessionインターフェースで定義されてるメソッド。第一引数にはデータ名、第二引数にデータ値を指定し、セッションスコープを持つデータ値を登録。
void invalidate() 生成されているセッションオブジェクト(セッションID)を破棄
boolean isNew() clientがセッション管理されていない時はtureを返却。(初回アクセスとか、cookie使えない時)
セッションの保持期間は?

セッションIDは未来永久ではない。
一定期間を過ぎるか、client側がブラウザを閉じるか(最近のブラウザではセッションも保持してたりするけれど。。)、invalidateメソッドで削除されるかになる。
セッションIDの保持期間は、web.xmlで指定できるよ。
tomcatのdefault動作では、30分になってる。

- sample web.xml
<session-config>
  <session-timeout>180</session-timeout>      // 単位は分
</session-config>
- sample code
package info.koba;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionServlet extends HttpServlet{
	public void doGet(HttpServletRequest req, HttpServletResponse res)
    			throws ServletException, IOException{
    	
    	String id = "java";
    	// セッションオブジェクトがない場合に、セッションオブジェクトを生成する。
    	HttpSession sess = req.getSession();
    	
    	PrintWriter out = res.getWriter();
    	
    	out.println("<html><head><title>session test</title></head>");
    	out.println("<body>");
    	
    	// client側がセッション管理されてるかどうかを判断
    	if(sess.isNew()){
    		sess.setAttribute("id",id);
    		out.println(sess.getAttribute(id) + ":  it's first request to this web site.");
    	} else{
    		out.println(sess.getAttribute("id") + ": it isn't first request to this web site");
    	}
    	
    	out.println("</body></html>"); 	
    }
}
  • 初回アクセス時は、セッションIDがnullで「it's first request to this web site.」の表示。
  • reloadすると!!!ちゃんどセッションIDが表示されるよ。
  • とりあえずtomcat default設定の30分待ってreloadしてみたら、ちゃんと破棄されてた!!
cookieが使えない場合どうするか?

clientがcookieを使えない場合には、URLリンクにセッションID付けたりする。

戻り型 method 説明
String encodeURL(String) HttpServletResponseインタフェースで定義されているメソッド。引数に指定されたURLにセッションIDを付与したURLを生成。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。
String encodeRedirectURL(String) HttpServletResponseインタフェースで定義されているメソッド。sendRedirectメソッドで使用するためにセッションID を付与したURLを生成。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しない。
- sample code
String url = res.encodeURL("./SessionServlet");
out.println("<a href=\"" + url + "\">SessionServlet</a>");

- 実行結果
<a href="./SessionServlet;jsessionid=8692969BBD04A69879B6206276D54D1D">
SessionServlet
</a>