使用form表單模擬用戶注冊,主要用到:表單令牌+驗證碼+獨立驗證器
令牌表單
表單令牌的作用在于防止數(shù)據(jù)的重復(fù)提交,原理是生成一個token值,用session緩存起來,這個過程是在打開填寫表單的頁面時就生成了,然后我們填寫完數(shù)據(jù)是提交到php頁面,此時的token值會和之前緩存起來的值進行對比,如果不一樣就會報錯。如果token一樣則不會重復(fù)提交數(shù)據(jù)的(后臺處理)
驗證規(guī)則支持對表單的令牌驗證,首先需要在你的表單里面增加下面隱藏域:
<input type="hidden" name="__token__" value="{$Request.token}" /> 或 {:token()}
然后在你的驗證規(guī)則中,添加token驗證規(guī)則即可,例如,如果使用的是驗證器的話,可以改為:
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', ];
如果需要自定義令牌生成規(guī)則,可以調(diào)用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、框架的內(nèi)置驗證功能
在模版內(nèi)添加驗證碼的顯示代碼
<div>{:captcha_img()}</div> 或者 <div><img src="{:captcha_src()}" alt="captcha" /></div>
然后使用框架的內(nèi)置驗證功能(具體可以參考驗證章節(jié)),添加captcha驗證規(guī)則即可
$this->validate($data,[ 'captcha|驗證碼'=>'require|captcha' ]);
如果沒有使用內(nèi)置驗證功能,則可以調(diào)研內(nèi)置的函數(shù)手動驗證
if(!captcha_check($captcha)){ // 驗證失敗操作 };
2、調(diào)用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; // 使用中文驗證碼
顯示結(jié)果
————————————————————————————————————————————————
案例:
控制器代碼
// 顯示模板 public function formtoken(){ return $this->fetch(); } // 驗證數(shù)據(jù) public function formtoken2(){ //1.從表單獲取到要驗證的數(shù)據(jù) $data = Request::param(); //驗證數(shù)據(jù) $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'); } // 模擬登陸成功要跳轉(zhuǎn)到的頁面 public function admin(){ return $this->display("<h2>歡迎登錄網(wǎng)站后臺!</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> <!--添加一個表單隱藏域,將表單令牌發(fā)送到服務(wù)器上的腳本進行驗證 --> <input type="hidden" name="__token__" value='{:token()}' /> <p> <button>登錄</button> </p> </form>
注冊界面顯示
錯誤提示
驗證通過
注冊成功跳轉(zhuǎn)
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號