thinkphp的表单如何使用令牌功能,如何防止表单重复提交?
thinkphp框架中已经定义好了令牌功能,我们只需要按照格式配置和启用就可以了。
令牌的使用思路?
首先需要在thinkphp的配置文件中添加令牌参数,配置参数如下图:
//令牌配置文件 'TOKEN_ON'=>true, // 是否开启令牌验证 'TOKEN_NAME'=>'__hash__', // 令牌验证的表单隐藏字段名称 'TOKEN_TYPE'=>'md5', //令牌哈希验证规则 默认为MD5 'TOKEN_RESET'=>true, //令牌验证出错后是否重置令牌 默认为true |
然后可以在表单中,添加参数,让thinkphp自动填充令牌标识数据,配置方法是在想要添加的地方,配置参数{__TOKEN__},thinkphp会将{__TOKEN__}自动替换成加密的字符串作为令牌参数。也可以不添加{__TOKEN__},如果不添加的话,thinkphp会自动在</form>前面生成令牌参数,但是如果,我们使用ajax来提交表单的话,可能页面没有form标签,则必须手动添加{__TOKEN__}。
thinkphp自动生成的令牌元素如图:
thinkphp为我们自动生成了令牌元素,我们用ajax提交表单的时候,需要将令牌数据传递到action类里面进行验证,如果令牌有效,表单会提交,令牌失效则给出提示。
ajax提交表单的代码如下:
将令牌的参数__hash__传递给action进行判断。
<script> $(function(){ //弹出提示信息方法 function show_tip(str){ $('.tip').css('display','block'); $('.tip').html(str); } $('.btn-submit').click(function(){ var name=$('[name="name"]').val(); var tel=$('[name="tel"]').val(); var __hash__=$('[name="__hash__"]').val(); var s={$Think.get.s}; if(s!=1&&s!=2){ s=1; } if(name==''){ show_tip('请输入姓名'); return false; } var preg=/^1[3|4|5|7|8]\d{9}$/; var res=preg.test(tel); if(!res){ show_tip('请输入正确的手机号'); return false; } var url='{:U("Index/btnAjax")}'; var data="type="+type+"&name="+name+"&tel="+tel+"&__hash__="+__hash__; $(url,data,function(rs){ if(rs){ show_tip('报名成功'); }else{ show_tip('报名失败'); } },'json'); }); }); </script> |
ajax提交之后,在action页面进行验证代码如下:
public function testAjax(){ if(!empty($_POST)){ $model=M('custome_special'); if(!$model->autoCheckToken($_POST)){ $res=false;//提示请填写信息! echo json_encode($res); exit; } $data['name']=trim(addslashes($_POST['name'])); $data['phone']=trim(addslashes($_POST['tel'])); $phone=trim(addslashes($_POST['tel'])); //生成唯一的id号 $id = md5(uniqid(mt_rand(), true)); $id=strtoupper($id); $data['id']=$id; //=============================================连接数据库存放用户报名的数据 $tmp=$model->where('mobilephone="'.$phone.'"')->find(); if($tmp){ $res=true;//已报名判断标志 echo json_encode($res); exit; } } } |
thinkphp的action验证令牌的方法是autoCheckToken()方法,首先是用快速方法M连接数据库,然后调用autoCheckToken()方法,即可验证令牌,验证失败就向ajax返回验证失败的标识。
宠物免费领养小程序,欢迎来踩