7.
ログイン認証
ユーザモデル
ログイン認証するにはユーザ情報が必要です。まだデータベースは扱わないので、ユーザモデルを作成してテストデータで処理します。
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);
}
}