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>