問題記錄-----表單重複提交==>利用session驗證
阿新 • • 發佈:2018-11-20
問題記錄-----表單重複提交==>利用session驗證
大概方法就是利用session生成一個token做提交驗證,話不多說上程式碼
html程式碼
<form id="frmsave" action="" enctype="multipart/form-data" method="POST" class="form-horizontal">
<input type="hidden" name="st" value="<?= $st ?>" />
//....其他提交的省略
</form>
php程式碼
if (!cc_empty($_POST))
{
session_token(1,$_POST['st']); //如果有資料提交則驗證token
unset($_POST['st']); //驗證通過則刪除
}
else
{
$tpl=$this->tpl().'index';
$data=array(
'st'=>session_token(),//交出session生成的表單token
);
$this->view($tpl,$data);
}
/*****************************************************************/
//session令牌,防止表單重複提交
function session_token($handon=0,$handon_token=''){
if(!isset($_SESSION)){
session_start();
}
if($handon==0){
$_SESSION['token']=time();
return $_SESSION['token'];
}
else if($handon==1){
//表單提交時,如果沒有token或者不等於session就die
if (!isset($_SESSION['token']) || $_SESSION['token']==null || (strcmp($_SESSION['token'], $handon_token)!=0)){
is_ajax()?send_json(1,'nothing'):die();
}
//否則置空session
$_SESSION['token']=null;
}
else{
die('非法操作');
}
}
至於前端的限制,一開始用了jq控制提交按鈕去禁用,而我的二手電腦每次點提交都會卡一下,alert測試發現問題隨緣出現,懷疑是電腦太卡導致jq的禁用處理太慢,於是改成了定義一個js變數為1,點選提交按鈕觸發+1,提交前驗證是否為2,否則return false。
這裡說一下提交表單儘量通過js去提交,可以用formdata或者其他,這樣對錶單的處理比較好處理