使用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; // 使用中文验证码
显示结果
————————————————————————————————————————————————
案例:
控制器代码
// 显示模板 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>
注册界面显示
错误提示
验证通过
注册成功跳转