JSPでセッションを使う

[サーバの実験室 Slackware]

作成 : 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へリダイレクトする。 ユーザ認証に失敗した場合は、再度このページを表示する。

login

"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を実行する。

index

<%@ 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へリダイレクトする。

login

ブラウザが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>

[サーバの実験室 Slackware]