Laravel 5.8 Session::put设置失效,表单提交频率限制不生效如何解决?
问题诱因
- Session写入逻辑错误
Laravel的Session::put()方法需要传入键名和键值两个参数,你仅传入了键名request_has_been_sent,对应写入的键值为null;而Session::has()方法判断规则为「键存在且值不为null」,所以永远返回false,无法触发限制逻辑。 - 无时间校验逻辑
现有逻辑即使写入成功,也只会在整个会话有效期内永久限制提交,不符合「每2小时可提交一次」的需求。 - 会话未持久化(常见场景)
如果表单提交路由未挂载到web中间件组下,Laravel不会自动做会话持久化,Session写入仅在当前请求内存中生效,请求结束后自动销毁,无法在后续请求中读取到。
正确实现方案
因为Laravel Session不支持单独给单个键设置过期时间,建议存储用户上次提交的时间戳,每次提交时校验时间差,实现2小时限制:
1. 路由配置确认
确保处理表单提交的路由在routes/web.php文件中,或者手动配置了web中间件,保证会话持久化正常工作:
Route::post('/withdraw/apply', [WithdrawController::class, 'apply'])->middleware('web');
2. 控制器代码修正
// 校验2小时内是否提交过 $lastSubmitTime = Session::get('last_withdraw_submit_time'); if ($lastSubmitTime && time() - $lastSubmitTime < 7200) { return redirect()->back()->with('error', '2小时内仅可提交一次申请,请稍后再试'); } // 校验通过写入提现记录 $withDraw = WithdrawWallet::create([ 'balance_value' => $request->balance_wallet, 'can_draw' => $request->can_draw, 'shaba_number' => $request->shaba_number, 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'description' => $request->desc, 'status' => 'pending', 'user_id' => auth()->user()->usr_id, ]); // 写入本次提交时间戳到Session Session::put('last_withdraw_submit_time', time()); // 可选增强方案:如果需要避免用户清除Cookie、切换设备绕过限制,可在用户表新增`last_withdraw_submit_time`字段,同步写入数据库,校验时优先读取数据库字段 // auth()->user()->update(['last_withdraw_submit_time' => time()]); return redirect()->back()->with('success','申请提交成功');
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

