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}");
    }
}
enyccc
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!