ユーザモデル

ログイン認証するにはユーザ情報が必要です。まだデータベースは扱わないので、ユーザモデルを作成してテストデータで処理します。

Userクラス作成

「model」パッケージに「User」クラスを作成します。今回はカプセル化しません。

User.java
package model;

public class User {
	public Integer id;
	public String email;
	public String name;
	public String password;
}

テストユーザ作成

テストユーザ用の「TestUser」クラスを作成します。特定のユーザを取得するgetOne() メソッドを作成します。

TestUser.java
package model;

public class TestUser {
	
	public static User getOne()
	{
		User user = new User();
		user.id = 1;
		user.name = "Alice";
		user.email = "[email protected]";
		user.password = "pass1234";
		return user;
	}

}

認証メソッド追加

「User」クラスに auth() を追加し、「Email」「パスワード」で認証チェックします。認証成功の場合はテストユーザを返します。

User.java
public class User {

	...

	public User auth(String email, String password)
	{
        //テストユーザ
		User user = TestUser.getOne();
        //認証チェック
		if (email.equals(user.email) && password.equals(user.password)) {
            //テストユーザを返す
			return user;
		}
		return null;
	}
}

equals()

文字列を「 == 」で比較しても一致しないので注意が必要です。文字列の比較は、equals() メソッドを利用しましょう。

boolean = String.equals(文字列);

ログイン認証

認証処理

「LoginAuth」のPOSTリクエストで認証チェックし、成功と失敗それぞれコンソール表示しておきます。

LoginAuth.java
...
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String email = request.getParameter("email");
		String password = request.getParameter("password");

		User user = new User();
		User authUser = user.auth(email, password);
		if (authUser != null && authUser.id > 0) {
            //認証成功
			System.out.println("Login success!");
		} else {
            //認証失敗
			System.out.println("Login failed!");
		}

	}
...

認証処理の確認

データ送信

ログインフォームで、 「TestUser」の「Email」「パスワード」を入力して、結果をコンソールで確認してみましょう。

認証成功
Login success!
認証失敗
Login failed!

ユーザページ

認証の成功、失敗によってリダイレクト先を振り分けてみます。

ユーザトップページの作成

「WebContent」に、JSPファイル「views/user/index.jsp」を作成します。

HTMLの作成

「index.jsp」にHTMLコンテンツを作成します。

views/user/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>マイページ</title>
<link
	href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
	rel="stylesheet">
</head>
<body>
	<div class="container">
		<h2 class="text-center">マイページ</h2>
	</div>
</body>
</html>

ユーザサーブレット

ユーザ画面のURL

ユーザ画面は、以下のURLでGETリクエストに対応します。

http://localhost:8080/MyTweet/user/

サーブレット作成

「UserIndex」サーブレットを作成します。

WebServletアノテーション設定

「LoginIndex.java」を作成したら、WebServletアノテーションを修正します。

@WebServlet(name = "UserIndex", urlPatterns = { "/user/" })
public class UserIndex extends HttpServlet {
    ...
}
  • サーブレット名:UserIndex
  • URLパターン:/user/

View表示

ログイン画面のJSPパス「/views/login/index.jsp」を変数定義します

@WebServlet(name = "UserIndex", urlPatterns = { "/user/" })
public class UserIndex extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private String jsp = "/views/user/index.jsp"

}

doGet() でJSPファイルを RequestDispatcher で読み込みます。

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher(jsp).forward(request, response);
	}

Viewの確認

「http://localhost:8080/MyTweet/user/」にアクセスして、ユーザ画面が表示されるか確認してみましょう。

リダイレクト

リダイレクトとは

リダイレクトは、指定URLにジャンプ(転送)するHTTPプロトコルの機能です。データ更新処理や、意図的にHTMLを表示せずに自動でURLを切り替えるときに利用します。

sendRedirect()

ダイレクト処理は、response.sendRedirect() で処理します。

response.sendRedirect(転送先URL);		

request.getContextPath()

request.getContextPath() で現在のURLパスを取得します。転送するURLパスを生成するのに便利です。

String path = request.getContextPath();

リダイレクト処理

doPost() の認証処理で、成功、失敗それぞれのリダイレクト処理をします。

  • 成功: /user/
  • 失敗: /login/
Login.java
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String email = request.getParameter("email");
		String password = request.getParameter("password");;

		String uri = "";
		User user = new User();
		User authUser = user.auth(email, password);
		if (authUser != null && authUser.id > 0) {
			uri = request.getContextPath() + "/user/";
		} else {
			uri = request.getContextPath() + "/login/";
		}
		response.sendRedirect(uri);
	}

リダイレクトの確認

認証成功

認証成功で「/user/」にリダイレクトされたことを確認しましょう。

認証失敗

認証失敗で「/login/」にリダイレクトされたことを確認しましょう。

ソース

login.LoginAuth.java
package page.login;

import java.io.IOException;

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

@WebServlet(name = "LoginAuth", urlPatterns = { "/login/auth" })
public class LoginAuth extends HttpServlet {
	final static String USER_EMAIL = "[email protected]";
	final static String USER_PASS = "pass1111";

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		
		System.out.println(email);
		System.out.println(password);

		String uri = "";
		User user = new User();
		User authUser = user.auth(email, password);
		if (authUser != null && authUser.id > 0) {
			HttpSession session = request.getSession(true);
			session.setAttribute("auth_user", authUser);
			uri = request.getContextPath() + "/user/";
		} else {
			uri = request.getContextPath() + "/login/";
		}
		response.sendRedirect(uri);
	}
	
	
}
user.UserIndex.java
package page.user;

import java.io.IOException;

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.User;

@WebServlet(name = "UserIndex", urlPatterns = { "/user/" })
public class UserIndex extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private String jsp = "/views/user/index.jsp";

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher(jsp).forward(request, response);
	}

}

TomcatでつくるWebアプリ