由于tp5.1的验证码功能是基于session的,在前后端完全分离的情况下,如果状态保持的方式又是以token方式,那么用起来就不是太方便了。所以我改装了一下tp5.1的验证码功能模块,通过cache的方式实现前后端分离的情况下,对验证码进行验证。
但是这种改装也有其弊端与考虑不周的情况,目前可预见的一个弊端是:在高并发的情况下,验证码不一致也有几率验证通过。
详细改装步骤如下:
captcha类的entry函数:
// 保存验证码
$key = $this->authcode($this->seKey);
$code = $this->authcode(strtoupper(implode('', $code)));
$secode = [];
$secode['verify_code'] = $code; // 把校验码保存到session
$secode['verify_time'] = time(); // 验证码创建时间
Session::set($key . $id, $secode, '');
//把验证码也保存到缓存中,只有这句是我扩展的,上下都是这个类库原本的代码
Cache::set($code, 1, $this->expire);
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);
captcha类中自定义checkByCache函数:
/**
* 验证验证码是否正确
* @access public
* @param string $code 用户验证码
* @return bool 用户验证码是否正确
*/
public function checkByCache($code)
{
$key = $this->authcode(strtoupper($code));
// 验证码不能为空
$secode = Cache::get($key);
if (empty($code) || empty($secode)) {
Cache::set($key,'');
return false;
}
Cache::set($key,'');
return true;
}
调用示例:
//校验验证码
$captcha = new Captcha;
if(!$captcha->checkByCache($data['verify_code'])) {
return json(['code'=>-1,'msg'=>'无效验证码']);
}