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