Javaのログイン・ログアウトの仕組みとは?セッションで利用者を管理する方法|確認問題の回答例
Javaのログイン・ログアウトの仕組みとは?セッションで利用者を管理する方法の確認問題の回答例です。画面の移動と、サーバーに保存したログイン状態を分けて確認しましょう。
問題1:ログイン画面へ戻すだけではログアウトにならない
ログアウトしたとはいえません。リンクでlogin.htmlへ移動しても、セッションに保存したloginUserIdは残っています。必要なのは、LogoutServletで有効なセッションを取得し、invalidate()で無効にすることです。
ログアウト用フォームからPOST /logoutを送った後、/mypageを直接開いて確認します。MyPageServletが以前のログイン情報を使えず、ログイン画面へリダイレクトすれば、今回の例の期待する動きです。ブラウザに表示されているページの見た目だけでは判断しません。
問題2:セッションがあってもログイン済みとは限らない
getAttribute(“loginUserId”)がnullなので、ログイン画面へリダイレクトし、returnで終了します。セッションはログイン以外の用途でも作れるため、本人確認に成功したときに保存する情報まで確かめます。
getSession(false)は、既存の有効なセッションがあれば返し、なければnullを返します。ログイン状態を確認するだけの場面で、空のセッションを新しく作らないために使います。
問題3:sendRedirectだけではJavaの処理は止まらない
sessionがnullの分岐でreturnを削除すると、その後も実行が続き、session.getAttributeを呼ぼうとしてNullPointerExceptionになります。
セッションはあるがloginUserIdがnullの分岐でreturnを削除した場合も、表示用データの設定やJSPへのforwardへ進んでしまいます。リダイレクト後にforwardする処理は不正で、レスポンスが既に確定していればIllegalStateExceptionにもつながります。どちらの分岐も、ログイン画面へ案内した時点でreturnして、後ろの処理を実行しないようにします。
問題4:Servlet経由とJSPへの直接アクセスでは、止める場所が違う
| アクセス先 | 期待する動きと理由 |
|---|---|
| /mypage | MyPageServletが有効なログイン情報を確認できず、/login.htmlへリダイレクトする。 |
| /mypage.jsp | Servletから渡されるrequest属性displayUserIdがないため、JSPの先頭で404を返して終了する。 |
セッションの利用者IDをリクエストパラメータとして付けても、request属性displayUserIdにはなりません。Servlet経由のログイン確認と、JSP直接アクセス時の表示停止を区別することが重要です。