Java データベース

【Java】データベースに接続したログイン機能を作る

uhablog

こんにちは、大学時代にプログラミングの勉強を始め現在はエンジニアをしているuhablogです。
当ブログでは現役エンジニアがプログラミング初学者の方向けにプログラミングの学習法を発信しています。

今回の記事ではJavaでデータベース(PostgreSQL)に接続してユーザー認証を行うログイン機能を作っていきます。

開発環境にはeclipseを使用します。
また前提として既に動的Webプロジェクトが作成済みであること、PostgreSQLにユーザーの情報が入ったテーブルがあることとします。
動的Webプロジェクトの作成についてはこちらの記事をPostgreSQLでのテーブル作成はこちらの記事を参考にしてみてください。

\\一流講師に学ぼう!!//

Udemyでサーブレット&jspを学ぶ!!

返金保証付き

今回作るログイン機能の全体像

今回作成するログイン機能の全体像を簡単に説明します。

ブラウザに表示する画面はログイン情報を入力する画面とログイン後に遷移する画面の2種類です。

まずログイン情報を入力する画面でユーザーIDとパスワードの入力を行います。

入力された情報を元にDBに接続してユーザーIDとパスワードが一致したユーザーがいた場合はログイン成功の画面に遷移します。

一致したユーザーがいなかった場合はログイン画面にエラーメッセージの表示を行います。

ログイン画面の作成

まずはログイン画面を作っていきましょう。ユーザーIDとパスワードを入力する簡単なフォームを用意します。
WebContentの中にlogin.jspを作成します。
その上でbodyタグ内を以下のように追加します。

<!-- login.jspのbodyの中を以下の通り編集 -->
<!-- リクエストスコープからエラーメッセージを受け取る -->
<%String failureMessage = (String)request.getAttribute("loginFailure"); %>

<!-- エラーメッセージが存在するときだけ表示する -->
<% if (failureMessage != null) {%>
    <%=failureMessage %>
<%} %>

<!-- ログインフォーム。ユーザーIDとパスワードの入力を行う -->
<form action="Login" method="post">
    <input type="text" name="user_id">
    <input type="password" name="password">
    <input type="submit" value="ログイン">
</form>

はじめにリクエストスコープからエラーメッセージを受け取っています。そしてエラーメッセージが存在した時のみ画面に表示します。

<!-- login.jspのbodyの中を以下の通り編集 -->
<!-- リクエストスコープからエラーメッセージを受け取る -->
<%String failureMessage = (String)request.getAttribute("loginFailure"); %>

<!-- エラーメッセージが存在するときだけ表示する -->
<% if (failureMessage != null) {%>
    <%=failureMessage %>
<%} %>

フォームではユーザーIDをuser_idという名前で送り、パスワードをpasswordという名前でサーブレット側に送ります。

<!-- ログインフォーム。ユーザーIDとパスワードの入力を行う -->
<form action="Login" method="post">
    <input type="text" name="user_id">
    <input type="password" name="password">
    <input type="submit" value="ログイン">
</form>

formを使ってユーザーIDとパスワードをサーバーに送信する

サーブレットの作成

次に画面から送られてきたユーザーIDとパスワードを元に認証処理を行うサーブレットを作成します。

srcフォルダの中にloginパッケージを作成しLoginServletを作成します。
パスはなんでも大丈夫ですが、今回は「/Login」としました。

サーブレットを作成するときに指定したパスとログイン画面のformタグのaction属性には同じ値を設定する必要がある

今回はGETメソッドでリクエストが来たときに呼ばれるdoGetメソッドとPOSTメソッドでリクエストが来たときに呼ばれるdoPostメソッドを作っていきます。

doGetメソッドでログイン画面を表示する

まずdoGetメソッドは以下のようにします。

/**
 * Getでリクエストが来たときの処理
 * login.jspを画面に表示する
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("login.jsp").forward(request, response);
}

今回のdoGetメソッドはシンプルです。GETメソッドのリクエストを受け取った後、login.jspを画面に表示します。

request.getRequestDispatcher("login.jsp").forward(request, response);

doPostメソッドでログインの認証を行う

次にdoPostメソッドの作成を行います。内容は以下の通りです。

/**
 * 送られてきたユーザーIDとパスワードを元にDBに接続しログイン認証を行う
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // ユーザーから送信されたユーザーIDとパスワードを取得する。
    String userId = request.getParameter("user_id");
    String password = request.getParameter("password");

    // ログイン認証後に遷移する先を格納する
    String path = "";

    try {
        // PostgreSQLに接続するためのURL
        String url = "jdbc:postgresql://localhost:5432/yourDbName";
        String user = "yourUserName";
        String pass = "yourPassowrd";

        /*
         * 実行するSQL
         * idとpasswordが一致するユーザーのidをとってくる
         */
        String sql = "SELECT id FROM users WHERE id=? AND password=?";

        // PostgreSQLに接続する
        Class.forName("org.postgresql.Driver");
        try (Connection con = DriverManager.getConnection(url, user, pass);
                PreparedStatement pstmt = con.prepareStatement(sql)) {

            // 入力されたユーザーIDとパスワードをSQLの条件にする
            pstmt.setString(1, userId);
            pstmt.setString(2, password);

            // SQLの実行
            ResultSet res = pstmt.executeQuery();

            // ユーザーIDとパスワードが一致するユーザーが存在した時
            if (res.next()) {
                // user_idをリクエストスコープに設定する
                request.setAttribute("user_id", res.getString("id"));

                // ログイン成功画面に遷移する
                path = "loginSuccess.jsp";
            } else {
                // ログイン失敗の文言を追加する
                request.setAttribute("loginFailure", "ログインに失敗しました");

                // ログインに失敗したときはもう一度ログイン画面を表示する
                path = "login.jsp";
            }
        }
    }catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }

    RequestDispatcher rd = request.getRequestDispatcher(path);
    rd.forward(request, response);
}

はじめに送られてきたユーザーIDとパスワードをそれぞれuserID, passwordという変数に格納しています。

// ユーザーから送信されたユーザーIDとパスワードを取得する。
String userId = request.getParameter("user_id");
String password = request.getParameter("password");

その後PostgreSQLに接続するために必要な値を変数宣言して格納します。

// PostgreSQLに接続するためのURL
String url = "jdbc:postgresql://localhost:5432/yourDbName";
String user = "yourUserName";
String pass = "yourPassowrd";

次に今回実行するSQL文を作成します。
今回はidとパスワードが一致するユーザーデータのidをDBから取り出します。

/*
 * 実行するSQL
 * idとpasswordが一致するユーザーのidをとってくる
 */
String sql = "SELECT id FROM users WHERE id=? AND password=?";

DBに接続し、SQLを実行します。

// PostgreSQLに接続する
Class.forName("org.postgresql.Driver");
try (Connection con = DriverManager.getConnection(url, user, pass);
        PreparedStatement pstmt = con.prepareStatement(sql)) {

    // 入力されたユーザーIDとパスワードをSQLの条件にする
    pstmt.setString(1, userId);
    pstmt.setString(2, password);

    // SQLの実行
    ResultSet res = pstmt.executeQuery();

idとパスワードが一致しているユーザーが存在していた場合、res.next()がtrueになります。
この中で、ログインが成功した時の処理を記述します。

反対に、ユーザーが存在しなかった場合はres.next()がfalseになるので、ログイン失敗時の処理を記述します。

// ユーザーIDとパスワードが一致するユーザーが存在した時
if (res.next()) {
    // user_idをリクエストスコープに設定する
    request.setAttribute("user_id", res.getString("id"));
    // ログイン成功画面に遷移する
    path = "loginSuccess.jsp";
} else {
    // ログイン失敗の文言を追加する
    request.setAttribute("loginFailure", "ログインに失敗しました");

    // ログインに失敗したときはもう一度ログイン画面を表示する
    path = "login.jsp";
}

最後に設定されたパスに遷移してサーブレット内での処理は終了になります。

RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request, response);

ログイン成功画面

最後に認証に成功したのちに遷移するログイン成功画面を作成します。
loginn.jspと同じくWebContent内にloginSuccess.jspを作成します。
bodyタグ内を以下のように書き換えます。

<!-- リクエストスコープからログインユーザーのIDを取得する -->
<%String userId = (String)request.getAttribute("user_id"); %>

<!-- メッセージを表示する -->
<h1>ログイン成功!!</h1>
<h2>こんにちは!<%=userId %>さん</h2>

動作確認

動作確認を行います。サーバーを起動し、ブラウザで「http://localhost:8080/JavaWebApplicationSample/Login」にアクセスします。
すると殺風景ではありますがログインフォームが表示されます。

ユーザーIDとパスワードの入力を行い、ログインボタンを押すと認証処理がされます。
認証に成功した場合はログイン成功画面に遷移し、失敗した場合はログイン画面に戻り、エラーメッセージが表示されます。

ログイン成功時

ログイン失敗時

以上でJavaでデータベースを使ったログイン機能の実装を終わります。

プログラミング学習はUdemyがおすすめ

私はプログラミングの学習はUdemyで行うのが一番おすすめです。
Udemyでは動画講座でプログラミングなどのスキルを身につけることができます。
現役エンジニアがUdemyをオススメする理由は
・動画で好きなときに学べる
・一流の講師に学ぶことができる
・講師の方に質問ができる
・返金保証もある
・セールを頻繁に開催している
といったたくさんの理由があります。

現在Udemyではセールを開催しています!
通常時1万円から2万円前後の価格で講座が販売されていますが、セール時には1500円前後(ランチ代くらい)で一つの講座を購入することができます。
UdemyにはサーブレットでWebアプリ開発が学べる講座iconもあるので、JavaでWebアプリ開発する方法を学んでみたい!という方は今がチャンスです!

\\今ならセール開催中!//

Udemyでサーブレット&jspを学ぶ!!

返金保証付き

独学が不安な人へ

独学で学んでいく意志がある方にはUdemyなどで学習するのがおすすめですが、プログラミングを独学するにはそれなりにハードルがあります。

  • プログラミングで一度挫折した経験がある
  • 一人で学習する自信がないので、サポートが欲しい

という方にはプログラミングスクールを検討してみるのがおすすめです。

-Java, データベース
-