セッション
サーバ内に情報を保存し、異なるページ間で同一のクライアントを認識する仕組みのことです。
セッション管理
1.クライアントが初めてServletプログラムにアクセスした際、セッションIDが生成されます。
2.生成されたセッションIDはクライアントに返され、保管されます。
3.再びクライアントがServletプログラムにアクセスする際にセッションIDがクライアントから送信されます。
4.Servletプログラムでは送信されたセッションIDにより、同一クライアントかどうかを判断します。
これらの一連の処理はcookieにより管理されます。cookieが使えない環境では、URLリンクでセッションIDを管理することもできます。
戻り型 | メソッド | 説明 |
---|---|---|
HttpSession | getSession( ) | HttpServletRequestインタフェースで定義されているメソッドです。セッションオブジェクト(セッションID)を返します。セッションオブジェクトが生成されていない場合は、セッションオブジェクトを生成して返します。 |
Object | getAttribute(String) | HttpSessionインタフェースで定義されているメソッドです。引数に指定されたデータ名に該当するセッションスコープのデータ値を返します。該当のデータ名がない場合にはnullを返します。 |
void | void setAttribute(String, Object) | HttpSessionインタフェースで定義されているメソッドです。第一引数にデータ名、第二引数にデータ値を指定し、セッションスコープを持つデータ値を登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。 |
void | invalidate( ) | 生成されているセッションオブジェクト(セッションID)を破棄します。 |
boolean | isNew( ) | クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。 |
セッションのタイムアウト
セッションIDは一定時間経過するか、クライアントのブラウザを閉じるか、もしくはinvalidateメソッドを呼び出すと削除されます。どの程度経過するとセッションIDが削除されるかはweb.xmlのタグで指定できます。Tomcatのデフォルトの設定では30分になっています。また、HttpSessionインタフェースには、セッションごとに経過時間を設定できるsetMaxInactiveIntervalメソッド、getMaxInactiveIntervalメソッドが用意されています。
要素 | 内容 |
---|---|
session-timeout | セッションのタイムアウト時間を分単位で指定します。0もしくは0以下の値を指定した場合は、セッションがタイムアウトしないことを表します。 |
設定例
セッションのタイムアウトを180分に設定した例です。タグはタグ、タグの後に記述する必要があります。
<session-config>
<session-timeout>180</session-timeout>
</session-config>
Javaにおける使用例
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";
/**
* セッションオブジェクトが生成されていない場合、getSessionメソッドでセッションオブジェクトを生成します。
* セッションオブジェクトがすでに生成されている場合は、既存のセッションオブジェクトを返します。
**/
HttpSession hs1 = req.getSession();
PrintWriter out = res.getWriter();
out.println("<HTML>");
out.println("<BODY>");
/**
* クライアントがセッション管理されているかどうか(はじめてアクセスしたかどうか)で表示メッセージを変えます。
* セッション管理されていない場合、データidをsetAttributeメソッドで保存し、"id + Nice to meet you."を表示します。
* セッション管理されている場合は、データidの値をgetAttributeメソッドで取得し、"Hello! + id"を表示します。
**/
if (hs1.isNew()) {
hs1.setAttribute("id", id);
out.println(hs1.getAttribute("id") + " Nice to meet you.");
} else {
out.println("Hello! " + hs1.getAttribute("id"));
}
out.println("</BODY>");
out.println("</HTML>");
}
}
cookieが使用できない場合のセッション管理
クライアントがcookieを使用できない場合、URLリンクにセッションIDを付与することによりセッション管理ができるようになります。ServletプログラムはURLリンクから、同一クライアントかどうかを判別します。セッションIDが付与されたURLリンクを作成するためには以下のメソッドを使用します。
戻り型 | メソッド | 説明 |
---|---|---|
String | encodeURL(String) | HttpServletResponseインタフェースで定義されているメソッドです。引数に指定されたURLにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。 |
String | encodeRedirectURL(String) | HttpServletResponseインタフェースで定義されているメソッドです。sendRedirectメソッドで使用するためにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。 |
Javaにおける使用例
String url = res.encodeURL("./SessionServlet");
out.println("<A HREF=\"" + url + "\">SessionServlet</A>");