JSPでセッションを使う
作成 : 2005/02/12
JSPとセッション
ブラウザを起動して、はじめてJSPページにアクセスすると、暗黙のオブジェクトsessionが作成される。 クライアントとセッションはID(セッションID)で関連付けられ、セッションに関連付けられたオブジェクトはWEBアプリケーションを構成する複数のページから参照することができる。 セッションは、一定時間経過するか、ブラウザが閉じられるか、明示的に破棄されるまで有効。
Cookieとセッション
セッションIDをCookieとしてクライアントに保存する。 (ブラウザでCookieを有効にしておくこと)
/
+-login.jsp
+-index.jsp
+-logout.jsp
|
+-WEB-INF/
+-web.xml
login.jsp : ユーザ名とパスワードを入力するフォームを表示する。 ユーザ認証に成功したらユーザ名を格納したオブジェクトをセッションに関連付ける。 その後、index.jspへリダイレクトする。 ユーザ認証に失敗した場合は、再度このページを表示する。
"cookie?"(isRequestedSessionIdFromCookie()の戻り値)が"true"になっていれば、セッションIDをCookieから取得している。 ブラウザの更新ボタンをクリックしても"getId"(getId()の戻り値 = セッションID)が変化しないことに注目。
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
<%!
// ユーザ認証を行うユーザ定義メソッド"auth_check"
// 実際は、データベースなどでユーザ名とパスワードの関連付けが正しいかチェックすることになる
private boolean auth_check(String req_name, String req_pass) {
if(req_name.equals("user")) { // フォームから送信されたユーザ名が"user"なら
return(true); // true(認証成功)を返す
} else { // フォームから送信されたユーザ名が"user"以外なら
return(false); // false(認証失敗)を返す
}
}
%>
<%
if(request.getParameter("username") != null && request.getParameter("password") != null) {
// ログインフォームから送信されたリクエストパラメータがnullでなければ
if(auth_check(request.getParameter("username"),request.getParameter("password"))) {
// ユーザ定義メソッド"auth_check"を呼び出し、戻り値がtrue(認証成功)ならば
session.setAttribute("username",request.getParameter("username"));
// ユーザ名を格納したオブジェクト"username"をセッションに関連付ける
response.sendRedirect("index.jsp");
// index.jspにリダイレクト
}
}
%>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Login</title>
</head>
<body>
<p>
<form action="./login.jsp" method="post"> // フォームから入力したデータの送信先はこのページ
ID:<input name="username" /><br />
PASS:<input name="password" /><br />
<input type="submit" value="login" />
</form>
uname : <%= request.getParameter("username")%><br /> // ログインフォームから送信されたリクエストパラメータ"username"を取得
pass : <%= request.getParameter("password")%><br /> // ログインフォームから送信されたリクエストパラメータ"password"を取得
cookie? : <%= ((HttpServletRequest)request).isRequestedSessionIdFromCookie()%><br />
// isRequestedSessionIdFromCookie() : セッションIDがCookieから送られたか
isNew : <%= session.isNew()%><br /> // isNew() : クライアントがセッションに参加しているか
getId : <%= session.getId()%><br /> // getId() : セッションIDを取得
getAttribute : <%= session.getAttribute("username")%><br />
// getAttribute(name) : nameで関連付けられているオブジェクトを取得
getIntMaxInactiveInterval : <%= session.getMaxInactiveInterval()%><br />
// getMaxInactiveInterval() : 最後にアクセスしてからセッションを無効にするまでの取得
</p>
</body>
</html>
index.jsp : ユーザ名を格納したオブジェクトが取得できれば、ログイン成功とみなしセッションの情報を表示する。 ログインページを経由せずに直接このページを開こうとした場合は、オブジェクトが取得できないのでlogin.jspへリダイレクトする。 "ログアウト"ボタンを配置して、ボタンがクリックされたらlogout.jspを実行する。
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
<%
if(session.getAttribute("username") == null) { // ユーザ名を格納したオブジェクト"username"を取得できなければ
response.sendRedirect("login.jsp"); // ログインページにリダイレクト
}
%>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Index</title>
</head>
<body>
<p>
<form action="./logout.jsp" method="post">
<input type="submit" value="logout" />
</form>
cookie? : <%= ((HttpServletRequest)request).isRequestedSessionIdFromCookie()%><br />
// isRequestedSessionIdFromCookie() : セッションIDがCookieから送られたか
isNew : <%= session.isNew()%><br /> // isNew() : クライアントがセッションに参加しているか
getId : <%= session.getId()%><br /> // getId() : セッションIDを取得
getAttribute : <%= session.getAttribute("username")%><br />
// getAttribute(name) : nameで関連付けられているオブジェクトを取得
getIntMaxInactiveInterval : <%= session.getMaxInactiveInterval()%><br />
// getMaxInactiveInterval() : 最後にアクセスしてからセッションを無効にするまでの取得
</p>
</body>
</html>
logout.jsp : セッションを無効にして、関連付けられたオブジェクトを解放する。 その後、login.jspへリダイレクトする。
<%
session.invalidate(); // セッションを無効にして、関連付けられたオブジェクトを解放
response.sendRedirect("login.jsp"); // login.jspにリダイレクト
%>
web.xml : 必ずしも必要でないが、セッションのタイムアウト時間を設定する。 デフォルトは30分。 マイナスを指定すると、タイムアウトしない。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html; charset=UTF-8</mime-type>
</mime-mapping>
<session-config>
<session-timeout>30</session-timeout> // タイムアウト時間を分で指定
</session-config>
</web-app>
Cookieが使用できないとき(URL書き換え)
ブラウザがCookieを受け入れない場合、セッションIDをURLに埋め込むことにより、クライアントとセッションを関連付ける。
login.jsp : ユーザ名とパスワードを入力するフォームを表示する。 ユーザ認証に成功したらユーザ名を格納したオブジェクトをセッションに関連付ける。 リダイレクトする際にresponse.encodeURL()またはresponse.encodeRedirectURL()を通すことでURL書き換えの要・不要を判別し、必要であればセッションIDをリダイレクトURLに埋め込み、index.jspへリダイレクトする。
ブラウザがCookieを受け入れないとき、"cookie?"(isRequestedSessionIdFromCookie()の戻り値)は"false"になる。 "isNew"(isNew()の戻り値)は常に"true"を返し、ブラウザの更新ボタンをクリックするたびに"getId"(getId()の戻り値 = セッションID)が変化する。
ユーザ認証が成功してindex.jspにリダイレクトする際、セッションIDを埋め込んだ"/index.jsp;jsessionid=6FEDB2EFEF68E875AC134BF65F65DF3E"のようなURLが使用される。
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
<%!
// ユーザ認証を行うユーザ定義メソッド"auth_check"
// 実際は、データベースなどでユーザ名とパスワードの関連付けが正しいかチェックすることになる
private boolean auth_check(String req_name, String req_pass) {
if(req_name.equals("user")) { // フォームから送信されたユーザ名が"user"なら
return(true); // true(認証成功)を返す
} else { // フォームから送信されたユーザ名が"user"以外なら
return(false); // false(認証失敗)を返す
}
}
%>
<%
if(request.getParameter("username") != null && request.getParameter("password") != null) {
// ログインフォームから送信されたリクエストパラメータがnullでなければ
if(auth_check(request.getParameter("username"),request.getParameter("password"))) {
// ユーザ定義メソッド"auth_check"を呼び出し、戻り値がtrue(認証成功)ならば
session.setAttribute("username",request.getParameter("username"));
// ユーザ名を格納したオブジェクト"username"をセッションに関連付ける
response.sendRedirect(response.encodeURL("index.jsp"));
// 必要であればセッションIDをURLに埋め込み、index.jspにリダイレクト
}
}
%>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Login</title>
</head>
<body>
<p>
<form action="./login.jsp" method="post"> // フォームから入力したデータの送信先はこのページ
ID:<input name="username" /><br />
PASS:<input name="password" /><br />
<input type="submit" value="login" />
</form>
uname : <%= request.getParameter("username")%><br /> // ログインフォームから送信されたリクエストパラメータ"username"を取得
pass : <%= request.getParameter("password")%><br /> // ログインフォームから送信されたリクエストパラメータ"password"を取得
cookie? : <%= ((HttpServletRequest)request).isRequestedSessionIdFromCookie()%><br />
// isRequestedSessionIdFromCookie() : セッションIDがCookieから送られたか
isNew : <%= session.isNew()%><br /> // isNew() : クライアントがセッションに参加しているか
getId : <%= session.getId()%><br /> // getId() : セッションIDを取得
getAttribute : <%= session.getAttribute("username")%><br />
// getAttribute(name) : nameで関連付けられているオブジェクトを取得
getIntMaxInactiveInterval : <%= session.getMaxInactiveInterval()%><br />
// getMaxInactiveInterval() : 最後にアクセスしてからセッションを無効にするまでの取得
</p>
</body>
</html>