【Java】【SQL】ログイン処理:ユーザIDとパスワードを使用して、ログイン認証機能を実装する

■作成するプログラムの概要

・画面にユーザIDとパスワードを入力する。

・登録されているユーザであれば、ログイン完了画面に遷移し、ユーザIDとユーザ名を表示する。

・登録されていないユーザであれば、ログイン画面に遷移する。
なお、ログイン失敗メッセージを表示する。

■フローチャート

▼全体概要

▼ログイン確認サーブレットクラス

・Get処理


・Post処理

▼ユーザ検索処理

■プログラム仕様

▼ログイン確認サーブレットクラス(LoginUserServlet.java)

(1)GET処理

インプット処理内容アウトプット
ログイン画面へ遷移する。【URL*1】
ログイン画面

*1:URL(/WEB-INF/jsp/userlogin.jsp)


(2)POST処理

インプット処理内容アウトプット
【フォーム情報】
ユーザID
パスワード
【フォーム情報】を取得する。
【try】
Beanクラスをインスタンスする。
Beanクラスに入力したユーザIDとパスワードをセットする。
ユーザ検索処理を実行する。
▼条件分岐:検索結果
|【ユーザ件数0件もしくは複数件の場合】
|ログインNGフラグを立てる。
|ログイン画面へ遷移する。・・・①
------
|【else】
|ログインユーザ用にBeanクラスをインスタンスする。
|検索結果のユーザIDとユーザ名をBeanクラスにセットする。
|セッション情報にBeanクラスをセットする。
|ログインOK画面へ遷移する。・・・②

【URL*1】
ログイン画面


【URL*2】
ログインOK画面
【catch】
何らかの理由で失敗した場合、
エラーページにエラー文を渡して表示する。
【メッセージ】
エラーメッセージ
【URL】
エラー画面*3

*1:URL(/WEB-INF/jsp/userlogin.jsp)
*2:URL(/WEB-INF/jsp/userloginOK.jsp)
*3:URL(/WEB-INF/jsp/error.jsp)

▼ユーザ検索処理(LoginUserDAO.java)

(1)インスタンス処理

引数:なし
戻り値:new ユーザ検索処理クラス

インプット処理内容アウトプット
コードの簡略化を行うため、
インスタンスオブジェクトの生成時、
新規オブジェクトを返却する。
【オブジェクト】
new ユーザ検索処理クラス

(2)ユーザ検索処理

引数:Beanクラス
戻り値:配列(Beanクラス)

インプット処理内容アウトプット
【Beanクラス】
ユーザID
パスワード
初期値をセットする。
・DB接続=null
・ユーザID=BeanクラスのユーザID
・パスワード=Beanクラスのパスワード
戻り値用のBeanクラス格納配列をセットする。
【try】
jdbcドライバを読み込む。(OracleDB)(*1)
【DB情報】
ユーザ名
パスワード
PDB情報
DBへ接続する。(*2)
実行するSQL文をセットする。
SQLを実行する。
検索結果ユーザ情報格納用のBeanクラスをインスタンス。
■ループ処理:検索結果件数分
|ユーザIDとユーザ名をBeanクラスへセットする。
|配列にBeanごと格納する。
|検索結果ユーザ情報格納用のBeanクラスを初期化する。
【catch】sql実行失敗
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【catch】JDBCドライバ関連エラー
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【finally】
▼条件分岐
|【DB接続中の場合】
|DBとの接続を切る。
戻り値として、Beanクラス格納配列を返す。

(*1)jdbcドライバを読み込む。

以下のようにドライバ(ojdbc10.jar)を配置する。

なお、ドライバ(ojdbc10.jar)は、Oracle19cのものを使用する。(Oracle社からダウンロードしたもの)


(*2)DBへ接続する

DBへの接続は、以下の2通りのうち、Thin接続にて行う。

・Thin接続

jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>

・OCI接続(クライアント側にオラクルクライアントをインストールする必要あり)

jdbc:oracle:oci:<ユーザ名>/<パスワード>@<サービス名またはPDB名>

■テーブル定義(login_user)

ユーザ情報テーブルの定義情報を以下に示す。

カラム名(物理)カラム名(論理)Null判定キー
IDユーザIDNOT NULL主キーCHAR(5)
NAMEユーザ名NOT NULLVARCHAR2(12 CHAR)
PWパスワードNOT NULLVARCHAR2(50 CHAR)

■ユーザ情報テーブルのデータ情報

ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。

IDNAMEPW
12345本山太郎abcdef123
12346中村次郎abcdef456
12347山田花子abcdef789

■画面仕様

▼ログイン画面

・「ユーザID」と「パスワード」を入力できるフォームを作成し、「ログイン」ボタン押下時、ユーザ検索処理を実行する。
・ユーザ情報がある場合は、ログイン完了画面に遷移する。
・ユーザ情報がない場合は、ログイン画面に戻る。

ユーザID:5桁以下で入力必須
パスワード:入力必須

▼ログイン完了画面

・ログイン完了時、ユーザIDとユーザ名を表示する。

■サンプルコード

▼ログインサーブレットクラス(LoginUserServlet.java)

package servlet;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import bean.LoginUserBean;
import dao.LoginUserDAO;

/**
 * Servlet implementation class LoginUserServlet
 */
@WebServlet("/LoginUserServlet")
public class LoginUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// ログイン画面へ遷移
    	RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userlogin.jsp");
    	rd.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Jspのフォーム画面からログイン対象ユーザIDとパスワードを取得
		request.setCharacterEncoding("UTF-8");
		String input_userID = request.getParameter("userid");
		String input_userPW = request.getParameter("userpw");
		
		try{
			// Beanクラスのインスタンス
			LoginUserBean input_user = new LoginUserBean();
			
			// Beanクラスに入力したユーザIDとパスワードをセットする
			input_user.setLogin_user_id(input_userID);
			input_user.setLogin_user_pw(input_userPW);
			
			// リスト<Beanクラス>に検索結果を格納する
			ArrayList<LoginUserBean> user_list = LoginUserDAO.getInstance().SelectLoginUser(input_user);
			
			// ユーザ情報なしもしくは複数件の場合はログイン画面に戻る
			if (user_list == null || user_list.size() != 1){
				// ログインフラグを立てる(0:OK、1:NG)
				LoginUserBean result = new LoginUserBean();	
				result.setLogin_user_flg(1);
				// ログイン画面に返す
				request.setAttribute("result", result);
				request.getRequestDispatcher("/WEB-INF/jsp/userlogin.jsp").forward(request, response);
			} else {
				// ログインユーザ用にBeanクラスをインスタンス
				LoginUserBean result_user = new LoginUserBean();
				
				// ユーザIDとユーザ名のみ新たにBeanクラスに格納する
				result_user.setLogin_user_id(user_list.get(0).getLogin_user_id());
				result_user.setLogin_user_name(user_list.get(0).getLogin_user_name());
				
				// ログインOK画面に返す
				HttpSession session = request.getSession();
				session.setAttribute("result_user", result_user);
				request.getRequestDispatcher("/WEB-INF/jsp/userloginOK.jsp").forward(request, response);
				
			}
			
		}catch(Exception e){
			//何らかの理由で失敗したらエラーページにエラー文を渡して表示。
            request.setAttribute("error", e.getMessage());
            request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
		}
	}

}

▼Beanクラス(LoginUserBean.java)

package bean;

import java.io.Serializable;

public class LoginUserBean implements Serializable{
	
	// フィールド宣言
	private String login_user_id;
	private String login_user_pw;
	private String login_user_name;
	private int login_user_flg;
	
	// ゲッターとセッターの作成(ユーザID)
	public String getLogin_user_id() {
		return login_user_id;
		}
	public void setLogin_user_id(String userid) {
		this.login_user_id = userid;
		}

	// ゲッターとセッターの作成(パスワード)
	public String getLogin_user_pw() {
		return login_user_pw;
		}
	public void setLogin_user_pw(String userpw) {
		this.login_user_pw = userpw;
		}
	
	// ゲッターとセッターの作成(ユーザ名)
	public String getLogin_user_name() {
		return login_user_name;
		}
	public void setLogin_user_name(String username) {
		this.login_user_name = username;
		}

	// ゲッターとセッターの作成(ユーザフラグ)
	public int getLogin_user_flg() {
		return login_user_flg;
		}
	public void setLogin_user_flg(int userflg) {
		this.login_user_flg = userflg;
		}
	
	
}

▼ユーザ検索処理(LoginUserDAO.java)

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import bean.LoginUserBean;

public class LoginUserDAO {

	// インスタンスオブジェクトの生成->返却(コードの簡略化)
	public static LoginUserDAO getInstance() {
		return new LoginUserDAO();
	}
	
	// 検索処理
	// 引数		:Beanクラス
	// 戻り値		:ArrayList<Beanクラス>
	public ArrayList<LoginUserBean> SelectLoginUser(LoginUserBean input_user) throws SQLException {
		// 初期値をセット
		Connection db_con = null;
		String id = input_user.getLogin_user_id();
		String pw = input_user.getLogin_user_pw();
		
		// 複数のユーザ情報を格納するため、Beanを格納する配列を作成
		ArrayList<LoginUserBean> 	array_userinfo = new ArrayList<LoginUserBean>();
	
		try {
			// jdbcドライバの読み込み(OracleDB)
			Class.forName("oracle.jdbc.driver.OracleDriver");
		
			//  DB接続
			db_con = DriverManager.getConnection(
				"jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>");
		
			// 実行するSQL文をセット
			String sql = "select * from login_user where id = ? and pw = ?";
					
			// DBで実行するSQL文を「prepareStatement」インスタンスに格納する
			PreparedStatement ps = db_con.prepareStatement(sql);
			ps.setString(1, id);
			ps.setString(2, pw);
			
			// SQL文の実行結果を格納
			ResultSet rs = ps.executeQuery();
			
			// 検索結果格納のため、Beanクラスをインスタンス
			LoginUserBean resultUserInfo = new LoginUserBean();
					
			// SQL文の実行結果件数分ループ処理
			while(rs.next()) {
				// ユーザIDと名前をBeanクラスへセット
				resultUserInfo.setLogin_user_id(rs.getString("id"));
				resultUserInfo.setLogin_user_name(rs.getString("name"));
				
				// リストにBeanクラスごと格納
				array_userinfo.add(resultUserInfo);
				
				//Beanクラスを初期化
				resultUserInfo = new LoginUserBean();
				}
			
		} catch(SQLException sql_e) {
			// エラーハンドリング
			System.out.println("sql実行失敗");
			sql_e.printStackTrace();
			
		} catch(ClassNotFoundException e) {
			// エラーハンドリング
			System.out.println("JDBCドライバ関連エラー");
			e.printStackTrace();
			
		} finally {
			// DB接続を解除
			if (db_con != null) {
					db_con.close();
			}
		}
		// リストを返す
		return array_userinfo;
	}
	
}

▼ログイン画面(userlogin.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="bean.LoginUserBean" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>

<form action="./LoginUserServlet" method="post">
	<p>
		ユーザID:<input type="text" name="userid" required>
		パスワード:<input type="password" name="userpw" required>
	</p>
	
	<input type="submit" value="ログイン">
	
</form>

<!-- ログイン失敗時の処理 -->
<%
	LoginUserBean userinfo = (LoginUserBean)request.getAttribute("result");
	if(userinfo != null) {
		if(userinfo.getLogin_user_flg() == 1){
%>
			IDまたはパスワードに不備があります
<%
		}
	}
%>

</body>
</html>

▼ログインOK画面(userloginOK.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@page import="java.util.ArrayList"%>
    
<%@ page import="bean.LoginUserBean" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログインOK画面</title>
</head>
<body>
<%
	LoginUserBean login_user = (LoginUserBean)session.getAttribute("result_user");
	
	if (login_user == null){
%>
	<br>
	<P>ログイン情報なし</P>
	<br>
<%	} else { %>
	<P>ユーザID:<%= login_user.getLogin_user_id() %></P>
	<P>ユーザ名:<%= login_user.getLogin_user_name() %></P>

	<% } %>
</body>
</html>

■実行結果

▼正常系(ログイン成功)

・ユーザ情報テーブルに登録されているユーザIDとパスワードを入力し、「ログイン」ボタンを押下する。


・ログイン完了画面へ遷移し、ユーザIDとユーザ名が表示される。

▼異常系(ログイン失敗)

・ユーザ情報テーブルに登録されていないユーザ名とパスワードを使用してログインを試みる。


・ログイン画面に戻り、エラーメッセージが出力される。

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