博客列表 >form表单模拟用户注册(不带数据库操作),表单令牌--20190325

form表单模拟用户注册(不带数据库操作),表单令牌--20190325

曲小冷
曲小冷原创
2019年03月28日 14:25:121108浏览

使用form表单模拟用户注册,主要用到:表单令牌+验证码+独立验证器

令牌表单

表单令牌的作用在于防止数据的重复提交,原理是生成一个token值,用session缓存起来,这个过程是在打开填写表单的页面时就生成了,然后我们填写完数据是提交到php页面,此时的token值会和之前缓存起来的值进行对比,如果不一样就会报错。如果token一样则不会重复提交数据的(后台处理)

验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域:

<input type="hidden" name="__token__" value="{$Request.token}" />
或
{:token()}

然后在你的验证规则中,添加token验证规则即可,例如,如果使用的是验证器的话,可以改为:

protected $rule = [
        'name'  =>  'require|max:25|token',
        'email' =>  'email',
    ];

如果你的令牌名称不是__token__,则表单需要改为:

<input type="hidden" name="__hash__" value="{$Request.token.__hash__}" />
或者:
{:token('__hash__')}

验证器中需要改为:

protected $rule = [
     'name'  =>  'require|max:25|token:__hash__',
     'email' =>  'email',
];

如果需要自定义令牌生成规则,可以调用Request类的token方法,例如:

namespace app\index\controller;
use think\Controller;
class Index extends Controller{
    public function index()
    {
        $token = $this->request->token('__token__', 'sha1');
        $this->assign('token', $token);
        return $this->fetch();
    }
}

然后在模板表单中使用:

<input type="hidden" name="__token__" value="{$token}" />
或者不需要在控制器写任何代码,直接在模板中使用:
{:token('__token__', 'sha1')}

验证码:两种使用方式

首先使用Composer安装think-captcha扩展包:

composer require topthink/think-captcha

1、框架的内置验证功能

在模版内添加验证码的显示代码

<div>{:captcha_img()}</div>
或者
<div><img src="{:captcha_src()}" alt="captcha" /></div>

然后使用框架的内置验证功能(具体可以参考验证章节),添加captcha验证规则即可

$this->validate($data,[
    'captcha|验证码'=>'require|captcha'
]);

如果没有使用内置验证功能,则可以调研内置的函数手动验证

if(!captcha_check($captcha)){
 // 验证失败操作
 };

2、调用Captcha类

use think\captcha\Captcha;
class Index {
	public function verify()
    {
        $captcha = new Captcha();
        return $captcha->entry();    
    }
}

在模板中就可以使用下面的代码显示验证码图片

<div><img src="{:url('index/verify')}" alt="captcha" /></div>

使用captcha类还可以修改验证码显示的属性:

例如 $captcha->useZh = true;     // 使用中文验证码

capcha.png

显示结果

yzm.png

————————————————————————————————————————————————

案例:

控制器代码

// 显示模板
public function formtoken(){
    return $this->fetch();
}
// 验证数据
public function formtoken2(){
    //1.从表单获取到要验证的数据
    $data = Request::param();

    //验证数据
    $validate = Validate::make();
    $res = $validate
        ->rule([
            'email|邮箱'=>'require|email',
            'password|密码'=>'require',
            'captcha|验证码'=>'require|captcha'
            ])
        ->check($data);
    if (false === $res){
        $this->error($validate->getError());
    }
    $this->success('注册成功','admin');
}
// 模拟登陆成功要跳转到的页面
public function admin(){
    return $this->display("<h2>欢迎登录网站后台!</h2>");
}

模板代码

<h3>用户注册</h3>
<form action="{:url('formtoken3')}" method="post">
    <p>
        <label for="email">邮箱:</label>
        <input type="email" name="email" id="email" />
    </p>
    <p>
        <label for="password">密码:</label>
        <input type="password" name="password" id="password" />
    </p>
    <p>
        <label for="captcha">验证码:</label>
        <input type="text" name="captcha" id="captcha" />
        <span class="captcha"><img src='{:captcha_src()}' alt="captcha" style="width: 250px;" /></span>
    </p>
    <!--添加一个表单隐藏域,将表单令牌发送到服务器上的脚本进行验证 -->
    <input type="hidden" name="__token__" value='{:token()}' />
    <p>
        <button>登录</button>
    </p>
</form>

注册界面显示

注册界面显示.png

错误提示

错误显示.png

验证通过

TONGGUO.png

注册成功跳转

注册成功跳转.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议