ログイン処理の追加

目次
  • 解説
  • 1. URLパターンの定義
  • 2. ログイン処理の内容
  • 3. データの受け取り
  • 4. 入力チェック
  • 5. 画面遷移
  • 6. リダイレクトとは
進捗を変更する




解説

1. URLパターンの定義


index.jsp」のログインフォームのaction属性には「/tweet_servlet/login」というURLパターンが指定されています。「/tweet_servlet」(プロジェクト名)以降の「/login」というURLパターンと「AuthController.java」が紐づくように設定します。

手順1

(1)AuthController.java」の「@WebServlet」のURLパターンを、「/login」に変更してください。

このように、ブラウザからのリクエストと、サーバーの処理を紐づけることをマッピングといいます。

Tips
eclipseでURLパターンを設定

eclipseではサーブレットクラス作成時に、自動でクラス名がURLパターンに設定されます。

2. ログイン処理の内容


ログインフォームと、「AuthController.java」のURLパターンを紐づけたので、ログインフォームから値を送信することで、「AuthController.java」のdoPostメソッドが動作するようになりました。次はログイン処理を実装していきます。

追加する処理は以下の通りです。

(1)ユーザーが入力したメールアドレス、パスワードの受け取り処理
(2)正しいメールアドレス、パスワードかどうかの検証処理
(3)検証結果による画面遷移の振り分け処理

3. データの受け取り


まずdoPostメソッド内に、ログインフォームから送られてきたデータを受け取る処理を追加します。

手順2

(1)AuthController.java」のdoPostメソッド内を、下記のコードで置き換えてください。
request.setCharacterEncoding("UTF-8");
String mail = request.getParameter("mail");
String pass = request.getParameter("pass");

解説

setCharacterEncoding()

setCharacterEncodingメソッドを使用すると、POST通信で送られてきたデータを、引数に指定した文字コードに変換するように設定できます。今回は文字化けを避けるために、最も使用される文字コードの「UTF-8」に設定しています。

getParameter()

getParameterメソッドを使用するとブラウザから送られてきたデータ(リクエストパラメーター)を取得することができ、引数にリクエストパラメーターの名前を設定することで対象のデータを取得することができます。

※リクエストパラメーターの名前とは、各フォームのname属性に設定した値のことです。

例)name属性をsampleとした場合

<input type="text" name="sample">
request.getParameter("sample");

今回は、getParameterメソッドの引数を「mail」と「pass」とすることで、ログインフォームでユーザーが入力したデータを取得することができます。

4. 入力チェック


DBに存在するユーザーのみがログインできるように機能を実装していくのですが、まだつぶやきアプリにはDBと連携する仕組みがありません。そのため、まずはログインできるのは下記のユーザーのみとします。

メールアドレスパスワード
test@test.comtestpass

手順2で置き換えたコードで受け取ったデータを、チェックする処理を追加します。

手順3

(1)AuthController.java」のdoPostメソッド内の最下部に、下記のコードを追記してください。
final String LOGINMAIL = "test@test.com";
final String LOGINPASS = "testpass";

チェック用のメールアドレス、パスワード情報を定数として定義しています。

(2)doPostメソッド内の最下部に、下記のコードを追記してください。
if(mail.equals(LOGINMAIL) && pass.equals(LOGINPASS)) {
		// ログイン成功時の処理
} else {
		// ログイン失敗時の処理
}

ブラウザから送られてきたデータと、チェック用の定数を比較する処理を追加しています。

これで、ユーザーが入力したメールアドレスが「test@test.com」かつ、パスワードが「testpass」の場合と、それ以外の場合で処理を分岐させることができました。

5. 画面遷移


次はログイン処理の成否によって、遷移先を分けていきましょう。

手順4

(1)AuthController.java」の「ログイン成功時の処理」のコメントの下に、下記のコードを追記してください。
response.sendRedirect("/tweet_servlet/top");

ログイン成功時はトップ画面に遷移するように処理を追加しています。

(2)ログイン失敗時の処理」のコメントの下に、下記のコードを追記してください。
response.sendRedirect("/tweet_servlet");

ログイン失敗時は再度ログイン画面に遷移するように処理を追加しています。

解説

sendRedirect()

sendRedirectメソッドを使用すると、引数に指定したURLパターンや、ファイルにリダイレクトを行います。

では、実行して動きを確認しましょう。
メールアドレス入力フォームに「test@test.com」を、パスワード入力フォームに「testpass」を入力し、送信すると「http://localhost:8080/tweet_servlet/top」に遷移し、それ以外を入力すると「http://localhost:8080/tweet_servlet」、つまりプロジェクトを起動した時とおなじURLにアクセスし、再度ログイン画面に遷移します。これで、DBを使用しない簡易的なログイン処理を実装することができました。

コラム
HTTPステータスコード

Webサイトを閲覧中に「404 Not Found」などの表示がされることがあります。 これは「HTTPステータスコード」といい、特によく表示されるものが以下の通りです。

403 Forbiddenページを見る権限がない場合に出るステータスコード
404 Not Foundページが存在しない場合に表示されるステータスコード
500 Internal Server Errorサーバーに何らかの問題が発生している場合に表示されるステータスコード

6. リダイレクトとは


リダイレクトとは、ブラウザに再度リクエストを促す処理です。リダイレクトを行うことで、ブラウザが、自動で指定した宛先にリクエストを行います。そのため、内部的に二度リクエストが行われ、URLは二度目にリクエストした宛先になります。

今回は遷移先のURLに変更したいため、リダイレクトを使用しています。


想定結果を表示


ソース全文を表示
package net.digskill.tweet_servlet.controller;

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;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String mail = request.getParameter("mail");
		String pass = request.getParameter("pass");

		final String LOGINMAIL = "test@test.com";
		final String LOGINPASS = "testpass";

		if(mail.equals(LOGINMAIL) && pass.equals(LOGINPASS)) {
			// ログイン成功時の処理
			response.sendRedirect("/tweet_servlet/top");
		} else {
			// ログイン失敗時の処理
			response.sendRedirect("/tweet_servlet");
		}
	}
}