首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Web 多重表單提交問題分析與防範

     編輯:Java 程式設計入門

使用者在網頁回應緩慢時可能連續點擊提交按鈕,導致重複請求造成資料重複、交易錯誤。本文分析多重提交成因,提供客戶端 JavaScript 阻擋與伺服器端 Token 機制兩種解決方案。

問題情境

使用者點擊「訂票」按鈕 → 伺服器處理緩慢 → 使用者以為失敗 → 再次點擊 → 產生多筆重複訂單。

方案一:客戶端 JavaScript 阻擋 (簡易但不可靠)

<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 請求繞過檢查。

方案二:伺服器端 Synchronizer Token Pattern (推薦)

  1. 表單產生時,Session 存入唯一 Token,並寫入隱藏欄位 <input type="hidden" name="token" value="${token}">。
  2. 表單提交時,比對請求參數 Token 與 Session Token:
    • 相符 → 處理業務,移除 Session 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)。
  • 資料庫層面加入唯一約束 (如訂單編號) 防止髒資料。
  • 採用 PRG 模式:POST 處理完畢 → Redirect 到 GET 結果頁,避免重新整理重複提交。

綜合建議:伺服器端 Token 為核心,輔以客戶端 UI 阻擋與 PRG 模式,構建多層防護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved