Laravel集成Google RecaptchaV3后本地环境表单验证错误不显示
问题根因
该问题完全由本地环境的会话存储配置触发:
- 本地使用
SESSION_DRIVER=cookie配置,Laravel会把所有会话数据(包括验证失败产生的$errors错误信息、表单旧输入闪存数据)全部存储在客户端Cookie中 - Google RecaptchaV3返回的token本身长度达数百字符,加上多字段验证错误的提示内容、所有表单旧输入值,最终导致整个Cookie的总大小超过了浏览器规定的4096字节上限,浏览器直接忽略了服务端返回的Set-Cookie响应头,验证失败的闪存数据没有被写入Cookie,页面刷新后自然读不到
$errors变量 - 线上环境使用
SESSION_DRIVER=memcached,会话数据全部存在服务端,Cookie仅存储长度极短的会话ID,不存在长度超限问题,因此运行正常
解决方案
方案1:修改本地会话驱动(最推荐)
直接修改本地.env文件的会话驱动配置,改用服务端存储的驱动即可,无需修改业务代码:
# 把原来的SESSION_DRIVER=cookie改成file即可,也可以用redis等其他驱动 SESSION_DRIVER=file
修改后执行php artisan config:clear清空配置缓存,重启服务即可生效。该方案和线上环境的运行逻辑一致,不会出现本地/线上行为不一致的问题。
方案2:精简闪存数据(若必须使用cookie驱动)
如果本地一定要用cookie驱动,可以重写注册逻辑的验证失败处理,排除不需要闪存的字段减少Cookie体积:
public function register(Request $request) { $validator = $this->validator($request); if ($validator->fails()) { // 排除不需要回显的captcha字段,减少存储体积 $request->flashExcept('g-recaptcha-response'); throw new \Illuminate\Validation\ValidationException($validator); } event(new Registered($user = $this->create($request->all()))); // 原有后续逻辑 }
方案3:本地开发关闭验证码验证
本地开发阶段可以新增配置开关直接跳过Recaptcha验证,避免token占体积:
首先在.env新增配置:
CAPTCHA_ENABLE=false
然后修改验证规则:
'g-recaptcha-response' => config('app.captcha_enable') ? ['required', new CaptchaV3($request->ip(), 'register')] : [],
线上环境把CAPTCHA_ENABLE设为true即可正常开启验证。
内容的提问来源于stack exchange,提问作者Nite
相关产品推荐
相关产品推荐

