使用者在網頁回應緩慢時可能連續點擊提交按鈕,導致重複請求造成資料重複、交易錯誤。本文分析多重提交成因,提供客戶端 JavaScript 阻擋與伺服器端 Token 機制兩種解決方案。
使用者點擊「訂票」按鈕 → 伺服器處理緩慢 → 使用者以為失敗 → 再次點擊 → 產生多筆重複訂單。
<form name="Order" action="./SimpleOrder" method="GET">
<input type="text" name="Concert">
<input type="button" name="btnSubmit" value="Do Submit"
onclick="checkSubmitCount();">
</form>
<script>
var submitCount = 0;
function checkSubmitCount() {
submitCount++;
if (submitCount === 1) {
document.Order.submit();
} else {
alert("已經提交過囉!提交次數:" + submitCount);
}
}
</script>
缺點:使用者可關閉 JavaScript、或直接發送 HTTP 請求繞過檢查。
<input type="hidden" name="token" value="${token}">。// Servlet 片段
String sessionToken = (String) session.getAttribute("formToken");
String requestToken = request.getParameter("token");
if (sessionToken != null && sessionToken.equals(requestToken)) {
session.removeAttribute("formToken"); // 消費 token
// 處理業務邏輯
} else {
// 重複提交處理
response.sendRedirect("duplicate.jsp");
}
disabled (配合 JS)。綜合建議:伺服器端 Token 為核心,輔以客戶端 UI 阻擋與 PRG 模式,構建多層防護。