前提・実現したいこと
現在、JSPとサーブレットを用いてログイン機能を作っています。
JSPの入力フォームに「ログインID」と「パスワード」を用意しており、何も入力しない状態で、ログインボタンを押すと、
エラーメッセージがサーブレットからJSPに返ってくるようになっております。
エラーメッセージの返し方はdoPostメソッド内でセッションを生成し、そのセッションにエラーメッセージを格納後、
sendsendRedirectsendRedirectでJSPの画面に戻り、上記セッションを渡しているという仕組みを取っています。
この時、エラーメッセージが表示された後に、ブラウザのリロードボタンかもしくはF5を押してページの更新をした際にエラーメッセージが表示されないようにしたいのですが、どのようにすれば実現可能か、もしご存知の方がいらっしゃいましたら、ご教示頂けますと幸いです。
該当のソースコード
【Login.jsp】
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.ArrayList"%> <% HttpSession ses = request.getSession(); ArrayList<String> errorMsg = (ArrayList<String>) ses.getAttribute("errorMsg"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ログイン画面</title> <style> h1 { font-size: 18px } h2 { font-size: 14px } </style> </head> <body> <h2>ログイン画面</h2> <% if (ses.getAttribute("sessionerror") != null) { %> <%=ses.getAttribute("sessionerror")%> <% } %> <% if (errorMsg != null) { for (int i = 0; i < errorMsg.size(); i++) { %> <ul><%=errorMsg.get(i)%></ul> <% } } %> <form method="POST" action="LoginAction" name="validataion"> <table> <tr> <td>ユーザーID:</td> <td><input type="text" name="user_id"></td> </tr> <tr> <td>パスワード:</td> <td><input type="password" name="user_pass"></td> </tr> <tr> <td> <tr> <td><input type="submit" value="ログイン"></td> </tr> </table> </form> </body> </html>
【LoginAction.java】
package main; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import jakarta.servlet.RequestDispatcher; 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; /** * Servlet implementation class LoginAction */ @WebServlet("/LoginAction") public class LoginAction extends HttpServlet { private static final long serialVersionUID = 1L; //バリデーションのためのエラーメッセージ final String BLANK_USRID_MSG = "ユーザーIDが入力されていません。"; final String BLANK_PASSWORD_MSG = "パスワードが入力されていません。"; /** * Default constructor. */ public LoginAction() { } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //ログインページからユーザーIDとパスワードを取得 String user_id = null; String user_pass = null; user_id = request.getParameter("user_id"); user_pass = request.getParameter("user_pass"); //エラーメッセージを格納する配列 ArrayList<String> errorMsg = new ArrayList<String>(); //USERテーブルから情報を取得してくるための準備 ReservationDao connectdb = new ReservationDao(); //セッションを生成 HttpSession ses = request.getSession(true); //バリデーション if (user_id.isEmpty() && user_pass.isEmpty()) { //ユーザーIDおよびパスワードの入力フォームが空白の状態でログインボタンを押下場合 errorMsg.add(BLANK_USRID_MSG); errorMsg.add(BLANK_PASSWORD_MSG); } //バリデーションに引っかかった場合エラーメッセージをログインページに返す ses.setAttribute("errorMsg", errorMsg); response.sendRedirect("/main"); } }
試したこと
セッション破棄の実装でやりたいことが実現できるのではないかと考えて、試してみたものの、どのタイミングで破棄を行うかがわからずといったところです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。