【2.3 自作Ecsite連載】MVCモデルでログアウト処理を記述する

zuka

こんにちは。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サーブレットは以下の記事で詳しく説明しています。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる