Javaのセッションとは?画面を移動してもログイン状態が続く仕組み|確認問題の回答例
Javaのセッションとは?画面を移動してもログイン状態が続く仕組みの確認問題の回答例です。Cookieに入るID、サーバーに保存する情報、画面へ渡す情報を分けて確認しましょう。
問題1:セッションIDとユーザーIDは役割が違う
| 項目 | 回答 |
|---|---|
| A1 | どのセッションかを識別する、説明用のセッションID。 |
| 1001 | どの利用者かを識別するユーザーID。 |
| Cookieに保存するもの | JSESSIONIDという名前で、セッションIDのA1を保存する。 |
| サーバーのセッションに保存するもの | loginUserIdという名前で1001、loginUserNameという名前で「学習ユーザー」を保存する。 |
今回のセッション用Cookieに、利用者情報全体やパスワードを入れるわけではありません。ブラウザから届いたセッションIDに対応する保存先を、サーバーが使います。A1は図を読みやすくするための値で、実際のセッションIDを自分で短く固定するものではありません。
問題2:新しいrequestへ、セッションから取り出し直す
- ブラウザが/session-pageへ新しいGETを送る。CookieのセッションIDも付ける。
- サーバーがそのIDに対応するセッションを使い、ServletがloginUserNameを取り出す。
- Servletが新しいrequestへ、displayNameという名前で「学習ユーザー」を設定する。
- 同じリクエストのままJSPへforwardし、JSPがdisplayNameを読んでHTMLを作る。
前のrequestやそのdisplayNameが残っているからではありません。セッションの値を取り出し、新しいrequestの表示用データを作り直しています。セッションが期限切れなどで無効になっていれば、この例ではログイン画面へ戻ります。
問題3:存在を確認する場面では、新しいセッションを作らない
getSession(false)は、有効なセッションがある場合だけ返し、なければnullを返します。ログイン状態を確認するだけの場面で、空のセッションを新規作成しないために使います。getSession()は、なければ新しく作ります。
セッションがあってもloginUserIdがnullなら、今回のコードは/login.htmlへリダイレクトし、returnで処理を終了します。ログイン情報を確認する前にJSPへ進みません。セッションはログイン以外にも使えるため、存在するだけで認証済みとは判断できないからです。
問題4:保存した名前と型を合わせて取り出す
String loginUserName = (String) session.getAttribute("loginUserName");
保存時と同じloginUserNameを指定します。戻り値はObject型なので、保存した文字列に合わせてStringへキャストしています。
String loginUserName = (String) session.getAttribute("userName");
userNameという属性は保存していないため、こちらはnullになります。左側のJavaの変数名がloginUserNameでも、保存先を探すときに使うのはgetAttributeの引数です。キャストによって、保存していない値が作られることはありません。