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

今回の記事ではJavaでデータベース(PostgreSQL)に接続してユーザー認証を行うログイン機能を作っていきます。開発環境にはeclipseを使用します。また前提として既に動的Webプロジェクトが作成済みであること、PostgreSQLにユーザーの情報が入ったテーブルがあることとします。動的Webプロジェクトの作成についてはこちらの記事をPostgreSQLでのテーブル作成はこちらの記事を参考にしてみてください。

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

今回作成するログイン機能の全体像を簡単に説明します。ブラウザに表示する画面はログイン情報を入力する画面とログイン後に遷移する画面の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>

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

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

サーブレットの作成

次に画面から送られてきたユーザーIDとパスワードを元に認証処理を行うサーブレットを作成します。srcフォルダの中にloginパッケージを作成しLoginServletを作成します。パスはなんでも大丈夫ですが、今回は「/Login」としました。doGetメソッドとdoPostメソッドの中を編集していきます。まず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を画面に表示します。

次に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という変数に格納しています。

その後PostgreSQLに接続するために必要な値を変数宣言して格納します。次に今回実行するSQL文を作成します。今回はidとパスワードが一致するユーザーデータのidをDBから取り出します。

DBに接続し、SQLを実行します。ここでユーザーの取得に成功していた場合は取り出したidをリクエストスコープに設定しておきます。逆にユーザーの取得ができていなかった時はエラーメッセージをリクエストスコープに設定しておきます。

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

 

ログイン成功画面

最後に認証に成功したのちに遷移するログイン成功画面を作成します。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で行うのが以下のような理由で圧倒的におすすめです。

  • 動画で好きなときに学べる
  • 一流のエンジニアから教えてもらえる
  • 好きな技術を体系的に学べる
  • 実際に手を動かしながら学ぶことができる
  • セール時であれば1500円〜2000円ほどで購入できる(大半の技術書より安い)
  • 講座自体がアップデートされていくので情報が古くなりにくい
  • UdemyにはJava x MySQLでWebアプリの作り方が学べる講座 もあるので興味がある方は一度チェックしてみてください!

    コメント

    タイトルとURLをコピーしました