Laravel session 验证码没保存的问题?
一个页面有3个图形验证码走同一个接口:
- /captcha/login
- /captcha/reg
- /captcha/forget
发现只能保存第三个forget的验证码,而第一二个未保存
同理再刷新一次页面的时候,增加了第一个或者第二个
就一定不会三个一起保存,求解释这是什么bug???
我猜测,是不是laravel在执行前,先一次性读入session文件内容,然后所有更改都在内存,最后执行结束前,在把session覆盖进文件中。这个时候3个请求搞同样一件事,造成了彼此之间的覆盖。
<?php
/**
* 图形验证码控制器
*/
namespace App\Http\Controllers;
use App\Helpers\Captcha;
use App\Http\Requests\CaptchaIndex;
use Gregwar\Captcha\CaptchaBuilder;
class CaptchaController extends Controller
{
use Captcha;
/**
* 获取图形验证码
*
* @param CaptchaIndex $request
*/
public function show($channel)
{
$builder = new CaptchaBuilder;
$phrase = $builder->setBackgroundColor(255, 255, 255)->build()->getPhrase();
// 保存验证码
$this->captchaSet($channel, $phrase);
//生成图片
return response($builder->get(), 200)->header('Content-Type', 'image/png');
}
}
/**
* 图形验证码操作函数
*/
namespace App\Helpers;
trait Captcha
{
/**
* 设置图形验证码
*
* @param string $channel 渠道
* @param string $code
* @return void
*/
public function captchaSet(string $channel, string $code)
{
session()->put("captcha.{$channel}", strtolower($code));
session()->save();
}
/***
* 检查图形验证码是否正确
*
* @param $channel
* @param $code
*/
public function captchaCheck(string $channel, string $code)
{
$captcha = session()->get("captcha.{$channel}");
return ($captcha && $captcha == strtolower($code));
}
/**
* 删除图形验证码
*
* @param $channel
* @param $ip
*/
public function captchaDelete(string $channel)
{
session()->remove("captcha.{$channel}");
}
}
推荐文章: