こんにちは。zuka(@beginaid)です。
この記事は,Ecsiteを自作するシリーズになります。今回はログイン処理を記述します。
その他のシリーズ記事は以下の目次をご覧ください。
完成品デモ
全体フロー
この記事では,以下のようなログアウト処理のフローを目指します。
流れ図
説明
基本的に,直接jspファイルにはアクセスできないような設計にしています。そのため,全てのjspファイルはWEB-INFディレクトリ下に配置しています。WEB-INF下に配置するとforwardは動作しますが,redirectが通らなくなります。そこで,jspファイルにredirectしたい場合は一回何らかのサーブレットを経由するようにします。今回でいえばDashboardサーブレットやLogoutサーブレットがjspへのリダイレクトを橋渡しする役割を果たします。
そもそも,なぜログイン処理でリダイレクトが必要なのかというと,URLを変えるためです。フォワードのみでログイン処理を記述してしまうと,ログインしていても,していなくてもブラウザには同じURLが表示されますから,ユーザは混乱してしまいます。そこで,ログイン後のURLを明示的に変えるためにリダイレクト処理を加えます。なお,リダイレクト後のURLを小文字構成にするために,橋渡しをするサーブレットの@WebServletアノテーションは小文字で指定します。
今回のログイン処理はMVCモデルに則っています。計算処理などを担当するModelはJavaのクラス,ページ表示を担当するViewはjsp,橋渡し役をするControllerはサーブレットによって実現させています。
具体的には,以下のようになっています。
- Model
- 該当なし
- View
- dashboard.jsp
- logoutComplete.jsp
- Controller
- Dashboard
- Logout
- Welcome
実装
以下では実装を確認していきます。Model,View,Controllerに分けてお伝えしていきます。今回はModelに該当するクラスがないため,ViewとControllerを確認します。
View
ダッシュボード画面を出力するdashboard.jspは以下の記事で詳しく説明しています。
ログアウト画面を出力するlogoutComplete.jspは以下の記事で詳しく説明しています。
Controller
まずはダッシュボード画面を出力するDashboardサーブレットです。不正アクセスの場合はエラーメッセージを格納してWelcomeサーブレットにリダイレクトしています。
package com.cod_aid.controller;
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 javax.servlet.http.HttpSession;
import com.cod_aid.model.User;
@WebServlet("/dashboard")
public class Dashboard extends HttpServlet {
private static final long serialVersionUID = 1L;
public Dashboard() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
session.setAttribute("errorIllegalAccess", "errorIllegalAccess");
response.sendRedirect("Welcome");
} else {
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/dashboard.jsp");
dispatcher.forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
続いて,ログアウト処理を記述するLogoutサーブレットです。sessionを無効化してログアウト画面を出力します。こちらも,不正アクセスの場合はエラーメッセージを格納してWelcomeサーブレットにリダイレクトしています。
package com.cod_aid.controller;
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 javax.servlet.http.HttpSession;
@WebServlet("/Logout")
public class Logout extends HttpServlet {
private static final long serialVersionUID = 1L;
public Logout() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
session.setAttribute("errorIllegalAccess", "errorIllegalAccess");
response.sendRedirect("Welcome");
} else {
session.invalidate();
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/logoutComplete.jsp");
dispatcher.forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Welcomeサーブレットは以下の記事で詳しく説明しています。
コメント