たけるのプログラミング

作ったものとか、気ままにアップします。

Javaでちょっとしたログイン機能を実装する方法

こんにちは!

今回はタイトル通りJavaでちょっとしたログイン機能を実装してみたいと思います。

開発&実行環境はこちら

  • Java11

完成したもの

f:id:takeru232423:20210108214649p:plain

データベースに保存されていない名前とパスワードを入力した場合
f:id:takeru232423:20210108214801p:plain

こんな感じで「ログインに失敗しました。」というメッセージが表示される。

データベースの内容

f:id:takeru232423:20210108222537p:plain

ソースコード

login.java

package servlet;

import java.io.IOException;

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 model.LoginLogic;


@WebServlet("/login")
public class login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Boolean b = false;
		request.setAttribute("login", b);
		RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/login.jsp");
		dispatcher.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
		String password = request.getParameter("password"); //リクエストパラメータの値を取得
		LoginLogic ll = new LoginLogic();
		int x = Integer.parseInt(ll.e(name,password));
		if(x==0) {
			Boolean b = true;
			request.setAttribute("login", b);
			RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/login.jsp");
			dispatcher.forward(request, response);
		}
		else {
			System.out.println("ログイン成功");//ログインに成功した後の処理を書いていく!
		}

	}

}

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
Boolean b = (Boolean) request.getAttribute("login");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>ログイン</h1>
<form action="/example/login" method="post">
名前:<input type="text" name="name">
パスワード:<input type="password" name="password">
<input type="submit" value="login">
</form>
<%if(b){ %>
<p><font color="red">ログインに失敗しました。</font></p>
<%} %>
</body>
</html>

LoginLogic.java

package model;

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

public class LoginLogic {
	static final String URL = "";  //データベースURL(各自設定してください!)
	static final String USERNAME = "";                        //ユーザ名(各自設定してください!)
	static final String PASSWORD = "";                   //パスワード(各自設定してください!)

	public String e(String a,String b) {
		String count=null;
		try {
			String sql = "select count((name='"+a+"' and password='"+b+"') or NULL) as count from user;";
			Class.forName("com.mysql.jdbc.Driver");
			Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
			PreparedStatement statement = connection.prepareStatement(sql);
			ResultSet result = statement.executeQuery();
			result.next();
			count = result.getString("count");
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return count;
	}
}

ソースコードの説明

今回のログイン機能はとても簡単なもので、ユーザーが入力した「名前」と「パスワード」に一致するレコードがデータベースにあるか調べ、ない場合は「ログインに失敗しました。」と表示するだけのものです。

  • まずlogin.javaを実行するとdoGet()メソッドが実行されます。その後login.jspフォワードされます。その際にリクエストスコープにfalseを保存し、login.jsp
<%if(b){ %>
<p><font color="red">ログインに失敗しました。</font></p>
<%} %>

が表示されないようにします。

  • ユーザーが名前とパスワードを入力し、loginボタンを押すと、login.javaのdoPost()メソッドが実行されます。doPost()メソッド内でログイン処理を行うLoginLogicというインスタンスを生成します。
LoginLogic ll = new LoginLogic();
		int x = Integer.parseInt(ll.e(name,password));

このeメソッドの中身は

String sql = "select count((name='"+a+"' and password='"+b+"') or NULL) as count from user;";

変数aとbに入力された名前とパスワードを入れ、countの条件に合うレコードをカウントします。つまり一致するものがあった場合1を返し、一致しない場合、つまりログインに失敗する時は0を返すことになります。この1、0がeメソッドの返り値ということになります。

if(x==0) {
			Boolean b = true;
			request.setAttribute("login", b);
			RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/login.jsp");
			dispatcher.forward(request, response);
		}

返り値をxに入れ0、つまりログインに失敗したのでTrueをリクエストスコープに保存し、login.jspフォワードします。そして先程falseで実行されなかった以下のコードが実行されます。

<%if(b){ %>
<p><font color="red">ログインに失敗しました。</font></p>
<%} %>

感想

ログイン画面で何も入力されなかった場合とかの処理も付け加えないといけないなと、コード書き終わって思いました。変数名もしっかりと考えなきゃな、、、