tokenの一致を調べることで2重送信を防止する方法を紹介します。

<!DOCTYPE html>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>送信エラー</title>
</head>
<body>
    <h1>送信エラー</h1>
    <p>フォームの送信中にエラーが発生しました。2重送信の可能性があります。</p>
    <a href="form.jsp">フォームに戻る</a>
</body>
</html>

<%@ include file="generateToken.jsp" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2重送信禁止サンプル</title>
</head>
<body>
    <form action="submit.jsp" method="POST">
        <!-- ここにフォーム要素を追加 -->
        <input type="hidden" name="token" value="<%= token %>">
        <button type="submit">送信</button>
    </form>
</body>
</html>

<%@ page import="java.util.UUID" %>
<%
    // トークンを生成し、セッションに保存
    String token = UUID.randomUUID().toString();
    session.setAttribute("token", token);
%>


<%@ page import="java.io.IOException" %>
<%
    String sessionToken = (String) session.getAttribute("token");
    String formToken = request.getParameter("token");
    if (sessionToken != null && sessionToken.equals(formToken)) {
        // トークンが一致した場合、処理を実行
        session.removeAttribute("token");
        // ここでフォームの処理を実行
        response.sendRedirect("success.jsp");
    } else {
        // トークンが一致しない場合、エラーを表示
        response.sendRedirect("error.jsp");
    }
%>

<!DOCTYPE html>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>送信成功</title>
</head>
<body>
    <h1>送信成功</h1>
    <p>フォームの送信が正常に完了しました。</p>
    <a href="form.jsp">フォームに戻る</a>
</body>
</html>

最後までお読みいただきありがとうございます。