thinkphp如何使用令牌防止表单重复提交

php thinkphp 表单提交 1856      收藏
thinkphp的表单如何使用令牌功能,如何防止表单重复提交?

thinkphp的表单如何使用令牌功能,如何防止表单重复提交?

thinkphp框架中已经定义好了令牌功能,我们只需要按照格式配置和启用就可以了。

令牌的使用思路?


首先需要在thinkphp的配置文件中添加令牌参数,配置参数如下图:

自学php博客

//令牌配置文件

'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自动生成的令牌元素如图:

自学php博客

thinkphp为我们自动生成了令牌元素,我们用ajax提交表单的时候,需要将令牌数据传递到action类里面进行验证,如果令牌有效,表单会提交,令牌失效则给出提示。

ajax提交表单的代码如下:

将令牌的参数__hash__传递给action进行判断。

自学php博客

<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页面进行验证代码如下:

自学php博客

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返回验证失败的标识。