下記GitHubのコードの解説である。
https://github.com/Fufuhu/SimpleAuthentication
NetBeans上でMavenのWebプロジェクトで作成している。
Servletとjspだけで構成されたシンプルな構成になっている。
(Webページディレクトリ直下のindex.jspは無視してもらって構いません。)
■画面遷移について
以下のような形で画面遷移を構成しています。
認証を通過すればtoppage.jsp, 失敗すればerror.jspに遷移する。
■index.jsp
ログインページ。ユーザ名とパスワードの入力したのちに、
ログインボタンクリックで、LoginServletを呼び出し、JDBCレルム
認証を実行することができる。
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ログイン</title> </head> <body> ログイン情報<br/> <form method="POST" action="../LoginServlet"> ユーザ名:<input type="text" name="username"/> <br/> パスワード:<input type="password" name="password"/><br/> <input type="submit" method="GET" value="ログイン"/> </form> </body> </html>
■LoginServlet(一部抜粋)
42行目のrequest.login(username, password);でJDBCレルム認証を実行している。
index.jspで入力されたユーザ名、パスワードの内容に応じてログイン可否を判断している。
loginメソッドで認証ができれば、そのままtoppage.jspへの遷移を続行。(ユーザ認証情報がセッションに含まれるようになる。)できなければServletExceptionがスローされるので、error.jspに遷移する。
package authentication; import java.io.IOException; import java.io.PrintWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author USER */ @WebServlet(name = "LoginServlet", urlPatterns = {"/LoginServlet"}) public class LoginServlet extends HttpServlet { private final String topPage = "/login/toppage.jsp"; private final String errorPage = "/login/error.jsp"; /** * * @param request servlet request * @param response servlet response * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); ServletContext sc = getServletContext(); try { //JDBCレルム認証部分(認証に失敗すると例外をスロー) request.login(username, password); } catch (ServletException ex) { Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex); try { sc.getRequestDispatcher(errorPage).forward(request, response); } catch (ServletException ex1) { Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex1); } } try { sc.getRequestDispatcher(topPage).forward(request, response); } catch (ServletException ex) { Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex); } } /** * Handles the HTTP <code>POST</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
■toppage.jsp
仮のトップページ。ウェルカムメッセージと、
ログアウトのための処理呼び出しが可能なだけ。
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>トップページ</title> </head> <body> <h1>ログインに成功しました。</h1><br/> <form action="./LogoutServlet"> ${param["username"]}様、いらっしゃいませ。<br/> <input type="submit" value="ログアウト"/> </form> </body> </html>
■LogoutServlet(一部抜粋)
request.getSession().invalidate();でセッション情報を明示的に破棄するとともに
request.logout();でログアウト処理を実行している。
package authentication; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author USER */ @WebServlet(name = "LogoutServlet", urlPatterns = {"/LogoutServlet"}) public class LogoutServlet extends HttpServlet { private final String indexPage = "./login/index.jsp"; private final String errorPage = "./login/error.jsp"; /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> * methods. * * @param request servlet request * @param response servlet response */ /** * @param request servlet request * @param response servlet response * @throws java.io.IOException */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { //セッションを明示的に破棄する。 request.getSession().invalidate(); ServletContext sc = getServletContext(); try { //認証からのログアウトを行う処理。 request.logout(); } catch (ServletException ex) { Logger.getLogger(LogoutServlet.class.getName()).log(Level.SEVERE, null, ex); try { sc.getRequestDispatcher(errorPage).forward(request, response); } catch (ServletException ex1) { Logger.getLogger(LogoutServlet.class.getName()).log(Level.SEVERE, null, ex1); } } response.sendRedirect(indexPage); } /** * Handles the HTTP <code>POST</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
■error.jsp
ログイン処理時にrequest.login()に失敗するとこちらのページに遷移する。
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>ログイン失敗</h1><br/> <a href="./index.jsp">ログインページへ</a> </body> </html>
次の記事では、コードではなく、アクセス制御(web.xml)の記入について説明します。
※生のxmlを書くわけではなく、NetBeansにおんぶにだっこで設定します。
おはようございます。
返信削除認証方法がしっかりしていれば、安心ですね。