防止表單重複提交主要有兩種方式:
1) 透過重定向(非Ajax表單提交)
2) 透過Session Token(Session令牌)
當客戶端請求頁面時,伺服器會產生隨機數,並且將該隨機數放置到session當中,然後將該隨機數發送給客戶端;如果客戶第一次提交,那麼會將該隨機數發送到伺服器端,伺服器會接收到該隨機數並且與session中所保存的隨機數進行比較,這時兩者的值是相同的,伺服器認為是第一次提交,並且將更新伺服器端的這個隨機數值;如果此時再次重複提交,那麼客戶端發給伺服器端的隨機數還是之前的那個,而伺服器端的隨機數已經發生了變化,兩者不同,伺服器就認為這是重複提交。
產生一個隨機數字並使用md5進行加密:
$_token = md5(microtime()+rand(1,10000)); $_SESSION['_token'] = $_token;
將該數值發送到客戶端,作為表單隱藏欄位提交:
<input type="hidden" value="<?php echo $_token;?>" name="_token"/>
然後在提交的時候將提交過來的資料和伺服器Session中的資料進行對比,如果為空或不相等,則都認為是非法操作:
if(!isset($_POST('_token'))){ echo json_encode(array('status'=>'failed','msg'=>'非法操作!')); exit(); } if(isset($_POST['_token']) && $_POST['_token']!=$_SESSION['_token']){ echo json_encode(array('status'=>'failed','msg'=>'表单只能提交一次,不能重复提交!')); exit(); }