You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:04