今回はログインの機能を作成していく。
ログインさえしてしまえばすべての機能を利用できるが、ログインしていない場合はサービスを利用できないサイトだ。
この機能を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");
}
}
コメント