Filterを使ったログイン機能の実践

JSP&Servlet

今回はログインの機能を作成していく。
ログインさえしてしまえばすべての機能を利用できるが、ログインしていない場合はサービスを利用できないサイトだ。
この機能をFilterを使って効率的に作成していく、Filterの理解を深める教材として使ってほしい。

環境

Eclipse2023(*バグフィックス済み) Java21 + Tomcat10(jakarta)

処理の流れ

◯ログイン画面

◯適当な名前とパスワードを入れるてログインを押す。
パスワードに[pass]という文字列以外を入れると以下のように
[パスワードが違います]
と表示される

◯名前と正しいパスワード(pass)を入れるとタイトル画面が表示される。
(この時入力した名前が表示されている)

◯日時確認機能

現在日時が表示される

◯占い

名前と運勢が表示される

◯ログアウト

ご利用ありがとうございましたと表示される

◯ログアウト状態にもかかわらず、URLから直接アクセスしようとした場合はLoginに強制リダイレクトさせられ、その際に[ログインしてください]というメッセージが表示される

方針

◯MVCに分割して作成していく
◯Filterを使ってログイン確認作業を実現する

作成

ファイル構成図

model.User.java

セッションスコープに格納されるのでJavaBeansの仕様を満たすように作成する。

package model;

import java.io.Serializable;

public class User implements Serializable{
	private String name;
	private String pass;
	
	public User() {}
	public User(String name,String pass) {
		this.name=name;
		this.pass=pass;
	}
	public String getName() {
		return name;
	}
	public String getPass() {
		return pass;
	}
}

model.LoginLogic.java

フォームから入力されたパスワードが[pass]かどうかを判定する

package model;

public class LoginLogic {
	public boolean isLogin(User user) {
		if(user.getPass().equals("pass")) {
			return true;
		}
		return false;
	}
}

controller.Login.java(サーブレット)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.LoginLogic;
import model.User;

@WebServlet("/Login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("WEB-INF/view/login.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		String pass=request.getParameter("pass");
		User user = new User(name,pass);
		LoginLogic logic = new LoginLogic();
		boolean isLogin = logic.isLogin(user);
		HttpSession session = request.getSession();
		if(isLogin) {
			session.setAttribute("user", user);
			response.sendRedirect("Title");
		}else {
			session.setAttribute("msg", "パスワードが違います");
			doGet(request,response);
		}
	}
}

WEB-INF/view/login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String msg = (String)session.getAttribute("msg");
if(msg != null){
	//フラッシュセッション(1度取得したら削除)
	session.removeAttribute("msg");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>miniapp</title>
</head>
<body>
<% if(msg != null){ %>
<p><%=msg %></p>
<%} %>
<p>名前とパスワードを入力してください</p>
<form action="Login" method="post">
名前:<input type="text" name="name" required autofocus><br>
パスワード:<input type="password" name="pass" required><br>
<button type="submit">ログイン</button>
</form>
</body>
</html>

controller.Title.java(サーブレット)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/Title")
public class Title extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("WEB-INF/view/title.jsp").forward(request, response);
	}

}

WEB-INF/view/title.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*"%>
<%
User user = (User)session.getAttribute("user");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>miniapp</title>
</head>
<body>
<p><%=user.getName() %>さん、こんにちは!</p>
<p>Menu</p>
<ol>
<li><a href="DateTime">日時確認</a></li>
<li><a href="Fortune">占い</a></li>
<li><a href="Logout">ログアウト</a></li>
</ol>
</body>
</html>

filter.LoginFilter.java( フィルター)

package filter;

import java.io.IOException;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebFilter(urlPatterns={"/Title","/DateTime","/Fortune"})
public class LoginFilter extends HttpFilter {
       
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpSession session = request.getSession();
		if(session.getAttribute("user")==null) {
			session.setAttribute("msg", "ログインしてください");
			response.sendRedirect("Login");
			return;
		}
		chain.doFilter(request, response);
	}
}

model.DateTimeLogic.java

package model;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTimeLogic {
	public String execute() {
		Date now = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yy年MM月dd日 HH:mm:ss");
		return sdf.format(now);
	}
}

controller.DateTime.java(サーブレット)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.DateTimeLogic;

@WebServlet("/DateTime")
public class DateTime extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		DateTimeLogic logic = new DateTimeLogic();
		String dateTime = logic.execute();
		request.setAttribute("dateTime", dateTime);
		request.getRequestDispatcher("WEB-INF/view/datetime.jsp").forward(request, response);
	}
}

WEB-INF/view/datetime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String dateTime = (String)request.getAttribute("dateTime");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>miniapp</title>
</head>
<body>
<p><%=dateTime %></p>
<a href="Title">タイトルに戻る</a>
</body>
</html>

model.FortuneLogic.java

package model;

public class FortuneLogic {
	public String execute() {
		String[] fortunes= {"大吉","中吉","吉","凶"};
		int idx = (int)(Math.random()*fortunes.length);
		return fortunes[idx];
	}
}

controller.Fortune.java( サーブレット)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.FortuneLogic;

@WebServlet("/Fortune")
public class Fortune extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		FortuneLogic logic = new FortuneLogic();
		String fortune = logic.execute();
		request.setAttribute("fortune", fortune);
		request.getRequestDispatcher("WEB-INF/view/fortune.jsp").forward(request, response);
	}
}

WEB-INF/view/fortune.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*"%>
<%
User user = (User)session.getAttribute("user");
String fortune= (String)request.getAttribute("fortune");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>miniapp</title>
</head>
<body>
<p><%=user.getName() %>さんの運勢は<%=fortune %>です</p>
<p><a href="Title">タイトルに戻る</a>
</body>
</html>

controller.Logout.java( サーブレット)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebServlet("/Logout")
public class Logout extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.removeAttribute("user");
		session.setAttribute("msg","ご利用ありがとうございました!");
		response.sendRedirect("Login");
	}
}

コメント

タイトルとURLをコピーしました