做汽配的网站,深圳地址大全,wordpress 前端用户中心,网络营销方式单一的原因大家都知道#xff0c;thinkphp框架的特点就是MVC模式#xff0c;验证码也是基于MVC开发的#xff0c;所以验证码是Session存储的#xff0c;Session存储在接口端#xff0c;当我们访问了浏览器才会执行Session#xff0c;所以我们通过接口调用的方式保存登录信息不行thinkphp框架的特点就是MVC模式验证码也是基于MVC开发的所以验证码是Session存储的Session存储在接口端当我们访问了浏览器才会执行Session所以我们通过接口调用的方式保存登录信息不行验证码也不行。那该怎么办呢下面来介绍下详细的解决步骤。
解决原理就是将验证码对Session改成Cache缓存没错就是这么干只需要修改两个地方即可。
1找到Captcha的源文件vendor/topthink/think-captcha/src/Captcha.php
修改
/*** 验证验证码是否正确* access public* param string $code 用户验证码* param string $id 验证码标识* return bool 用户验证码是否正确*/public function check($code, $id ){$key $this-authcode($this-seKey) . $id;// 验证码不能为空$secode Cache::get($key, ); //在这里把Session换成Cacheif (empty($code) || empty($secode)) {return false;}// session 过期if (time() - $secode[verify_time] $this-expire) {Session::delete($key, );return false;}if ($this-authcode(strtoupper($code)) $secode[verify_code]) {$this-reset Session::delete($key, );return true;}return false;}
2在同一个文件中找到生成验证码的方法同样将Session改成Cache
/*** 输出验证码并把验证码的值保存的session中* 验证码保存到session的格式为 array(verify_code 验证码值, verify_time 验证码创建时间);* access public* param string $id 要生成验证码的标识* return \think\Response*/public function entry($id ){// 图片宽(px)$this-imageW || $this-imageW $this-length * $this-fontSize * 1.5 $this-length * $this-fontSize / 2;// 图片高(px)$this-imageH || $this-imageH $this-fontSize * 2.5;// 建立一幅 $this-imageW x $this-imageH 的图像$this-_image imagecreate($this-imageW, $this-imageH);// 设置背景imagecolorallocate($this-_image, $this-bg[0], $this-bg[1], $this-bg[2]);// 验证码字体随机颜色$this-_color imagecolorallocate($this-_image, mt_rand(1, 150), mt_rand(1, 150), mt_rand(1, 150));// 验证码使用随机字体$ttfPath __DIR__ . /../assets/ . ($this-useZh ? zhttfs : ttfs) . /;if (empty($this-fontttf)) {$dir dir($ttfPath);$ttfs [];while (false ! ($file $dir-read())) {if (. ! $file[0] substr($file, -4) .ttf) {$ttfs[] $file;}}$dir-close();$this-fontttf $ttfs[array_rand($ttfs)];}$this-fontttf $ttfPath . $this-fontttf;if ($this-useImgBg) {$this-_background();}if ($this-useNoise) {// 绘杂点$this-_writeNoise();}if ($this-useCurve) {// 绘干扰线$this-_writeCurve();}// 绘验证码$code []; // 验证码$codeNX 0; // 验证码第N个字符的左边距if ($this-useZh) {// 中文验证码for ($i 0; $i $this-length; $i) {$code[$i] iconv_substr($this-zhSet, floor(mt_rand(0, mb_strlen($this-zhSet, utf-8) - 1)), 1, utf-8);imagettftext($this-_image, $this-fontSize, mt_rand(-40, 40), $this-fontSize * ($i 1) * 1.5, $this-fontSize mt_rand(10, 20), $this-_color, $this-fontttf, $code[$i]);}} else {for ($i 0; $i $this-length; $i) {$code[$i] $this-codeSet[mt_rand(0, strlen($this-codeSet) - 1)];$codeNX mt_rand($this-fontSize * 1.2, $this-fontSize * 1.6);imagettftext($this-_image, $this-fontSize, mt_rand(-40, 40), $codeNX, $this-fontSize * 1.6, $this-_color, $this-fontttf, $code[$i]);}}// 保存验证码$key $this-authcode($this-seKey);$code $this-authcode(strtoupper(implode(, $code)));$secode [];$secode[verify_code] $code; // 把校验码保存到session$secode[verify_time] time(); // 验证码创建时间Cache::set($key . $id, $secode, ); //这个地方也是将Session改成Cacheob_start();// 输出图像imagepng($this-_image);$content ob_get_clean();imagedestroy($this-_image);return response($content, 200, [Content-Length strlen($content)])-contentType(image/png);}
具体改哪行看注释说明。
到此问题解决。