1. 程式人生 > >防止form表單多次提交

防止form表單多次提交


點選提交按鈕兩次。
點選重新整理按鈕。
使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。
使用瀏覽器歷史記錄重複提交表單。
瀏覽器重複的HTTP請求。

使用者提交表單時可能因為網速的原因,或者網頁被惡意重新整理,致使同一條記錄重複插入到資料庫中,這是一個比較棘手的問題。我們可以從客戶端和伺服器端一起著手,設法避免同一表單的重複提交。

1、js禁掉提交按鈕。

表單提交後使用Javascript使提交按鈕disable。這種方法防止心急的使用者多次點選按鈕。但有個問題,如果客戶端把Javascript給禁止掉,這種方法就無效了

 

2、使用Post/Redirect/Get模式。

在提交後執行頁面重定向,這就是所謂的

Post-Redirect-Get (PRG)模式。簡言之,當用戶提交了表單後,你去執行一個客戶端的重定向,轉到提交成功資訊頁面。

這能避免使用者按F5導致的重複提交,而其也不會出現瀏覽器表單重複提交的警告,也能消除按瀏覽器前進和後退按導致的同樣問題。

 

3、在session中存放一個特殊標誌。

在伺服器端,生成一個唯一的識別符號,將它存入session,同時將它寫入表單的隱藏欄位中,然後將表單頁面發給瀏覽器,使用者錄入資訊後點擊提交,在伺服器端,獲取表單中隱藏欄位的值,與session中的唯一識別符號比較,相等說明是首次提交,就處理本次請求,然後將session中的唯一識別符號移除;不相等說明是重複提交,就不再處理。

這使你的web應用有了更高階的XSRF保護。

請見如下程式碼:

  1. <?php
  2. session_start();  
  3. //根據當前SESSION生成隨機數  
  4. $code = mt_rand(0,1000000);  
  5. $_SESSION['code'] = $code;  
  6. ?>
  7. 在頁面表單上將隨機數作為隱藏值進行傳遞,程式碼如下:  
  8. <inputtype="hidden"name="originator"value="<?=$code?>">
  9.     在接收頁面的PHP程式碼如下:  
  10. <?php
  11. session_start();  
  12. if(isset($_POST['originator'])) {  
  13. if($_POST['originator'] == $_SESSION['code']){  
  14. // 處理該表單的語句,省略  
  15. }else{  
  16. echo ‘請不要重新整理本頁面或重複提交表單!’;  
  17. }  
  18. }  
  19. ?>

4.使用header函式轉向

除了上面的方法之外,還有一個更簡單的方法,那就是當用戶提交表單,伺服器端處理後立即轉向其他的頁面,程式碼如下所示。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {

//處理資料,如插入資料後,立即轉向到其他頁面

header('location:submits_success.php');

}

這樣,即使使用者使用重新整理鍵,也不會導致表單的重複提交,因為已經轉向新的頁面,而這個頁面指令碼已經不理會任何提交的資料了。

5.表單過期的處理

在開發過程中,經常會出現表單出錯而返回頁面的時候填寫的資訊全部丟失的情況,為了支援頁面回跳,可以通過以下兩種方法實現。

1.使用header頭設定快取控制頭Cache-control。

header('Cache-control: private, must-revalidate'); //支援頁面回跳

2.使用session_cache_limiter方法。

session_cache_limiter('private, must-revalidate'); //要寫在session_start方法之前

下面的程式碼片斷可以防止使用者填寫表單的時候,單擊“提交”按鈕返回時,剛剛在表單上填寫的內容不會被清除:

session_cache_limiter('nocache');

session_cache_limiter('private');

session_cache_limiter('public');

session_start();

//以下是表單內容,這樣在使用者返回該表單時,已經填寫的內容不會被清空

6、在資料庫裡新增約束。

在資料庫裡新增唯一約束或建立唯一索引,防止出現重複資料。這是最有效的防止重複提交資料的方法。


相關推薦

防止form提交

點選提交按鈕兩次。點選重新整理按鈕。使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。使用瀏覽器歷史記錄重複提交表單。瀏覽器重複的HTTP請求。使用者提交表單時可能因為網速的原因,或者網頁被惡意重新整理,致使同一條記錄重複插入到資料庫中,這是一個比較棘手的問題。我們可以從客

防止提交的方法

作者:莎士比亞的人生 來源:CSDN 原文:https://blog.csdn.net/qq_34368762/article/details/79130198  表單重複提交是在多使用者Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重複提交問題,比如:

【原創】php將form請求的內容儲存到txt並顯示到form所在的頁面

小菜鳥分享小小經驗: 做之前百度理解相關函式(這個很重要),然後整合了一下自己的版本。 我做的是一個 同學聚會報名 頁面。 原始碼: <?php if(

js 防止重複提交

using (Html.BeginForm("action", "controller", new { }, FormMethod.Post, new { name = "submitForm" ,onsubmit="return checkSubmit();" }))

form選框提交數據 服務器只能接受到一個數據

表單提交 form 多選 提交過去後表單中name相同的值會被後一個覆蓋,而不會被單獨識別出來。在name名稱後面加上‘[]’即可;如 name=‘user[]‘ 註意下面兩個教程的區別,我很想知道w3c怎麽讀取到的。等待指教; http://www.w3school.com.cn/tags/at

防止form重複提交的八種方法

表單重複提交是在多使用者Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重複提交問題,比如: (1)點選提交按鈕兩次。 (2)點選重新整理按鈕。 (3)使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。 (4)使用瀏覽器歷史記錄重複提交表單。 (5)瀏

一個按鈕提交兩個form,分別提交到兩個action裡,第一個form的資料丟失

--背景 在一個iframe開啟的窗口裡,有兩個需要提交的form,而且需要提交到不同的兩個action裡,正常操作下丟失第一個form的資料 --解決方法 在這兩個form下新增一個新的iframe標籤<iframe id = "這個id要與這個視窗的iframe的id不同"&g

formGet方式提交時,action中帶引數傳遞不了

form表單get方式提交時,action中帶引數傳遞不了 樣例: <form action="getPostServlet/getPost.do?param4=param4" method="get"> <input type="hidden" name="p

使用FormData對包含檔案型別的form進行非同步提交(檔案上傳)並配置回撥

直接使用form表單的submit提交按鈕進行表單提交到action,這個是非非同步的,不但在action返回時需要重新整理頁面或跳轉至另外一個頁面,也不能配置回撥函式對返回資料進行某些處理。 其次,如果使用表單的serialize()方法進行ajax提交,則只能傳遞簡單

springMVC實現form資料+檔案提交

說明: 1、SpringMVC實現檔案上傳,需要再新增兩個jar包。一個是檔案上傳的jar包,一個是其所依賴的IO包。這兩個jar包 commons-fileupload-1.2.2.jar commons-io-2.4.jar Controller @Respon

使用jQuery重用form並非同步提交到其他action

在做頁面開發的時候,有時候要重用表單的資料,並非同步請求提交到其他的連結中,這個時候就可以使用jquery去修改表單的action值(記得使用後修改回來),並呼叫submit方法,當然後臺的連結action或者controller方法必須返回值型別為void,否則將發生頁面

form點選提交按鈕後 不重新整理頁面

<form id="user"> <button id="search" onclick="save()" >儲存</button> </form> function save(){ $.post("寫入

angularjs $http事務實現form序列化提交

    在angularJs中前後端資料互動時 在新增時需要對form表單進行處理,並通過$http提交 需要注意 :     1. $http()引數列表為Json陣列     2. 需要對form

跨域formsubmit按鈕提交頁面不跳轉

<html>      <body>            <form action="" method="post" target="nm_iframe">          <input type="text" id="id_in

點選form中的提交按鈕出現頁面重新整理效果的原因

最近做一個web開發,在做表單提交的時候,出現了類似於F5重新整理頁面效果的問題。(因為前臺開發沒有分離,所以一個js檔案最少也有五六千行,出了bug很難找到問題,所以真心建議前臺開發要分離開來)問題:點選提交按鈕,出現了F5重新整理頁面的效果問題原因:將提交按鈕button

form—2種提交方式

只提交引數到後臺,不接收返回值 html程式碼 <!--第1步:設定 action,method--> <form id="editForm" action="app/edit

獲取form由submit提交的內容

html中的form表單部分的程式碼 <form action="dbController.php" id="loginform" method="post"> <p&g

form的ajax提交【組裝json】

關鍵程式碼: /** * 將表單序列化 然後轉換成json資料 */ var data = $("#editForm").serializeObject(); JSON.stringify(data); //java後臺解析 DesignPlan bean = (Desi

個按鈕提交一個form

class 按鈕 控制 () ctx submit repo rep 事件 多個按鈕提交一個form表單,然後執行控制層不同的方法 在button的onclick事件下可以重寫form的action屬性 <button class="common_button" on

ASP.NET webform提交問題

的人 事件 client form gin ron 遇到 提交按鈕 orm 最近幾天遇到一個頭疼的問題,項目采用的是webform開發,每個界面都有個提交按鈕,點擊多次提交按鈕導致提交按鈕的OnClick事件執行了多次, 每次OnClick裏面都有一些邏輯處理,執行了