会话 put 似乎无法正常工作

Posted

技术标签:

【中文标题】会话 put 似乎无法正常工作【英文标题】:Session put does not seem to be working properly 【发布时间】:2022-01-02 18:51:09 【问题描述】:

我正在使用 Laravel 5.8,我想确保用户只能每 2 小时提交一次表单(只要会话处于活动状态)。

所以我在 Controller 上尝试了这个:

if(Session::has('request_has_been_sent'))
    return redirect()->back()->with('error', 'You just submitted a request and cannot submit a new one');
else
    $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::put('request_has_been_sent');


return redirect()->back()->with('success','Your request was sent');

因此,每次用户提交新请求时,都必须设置会话request_has_been_sent

因此,在用户下次提交表单时,如果会话仍然处于活动状态,则会出现消息 You just submitted a request and cannot submit a new one

但现在的问题是它不起作用。事实上,用户仍然可以在提交请求后立即提交另一个请求。

这意味着会话没有以某种方式设置。

那么这里出了什么问题?我怎样才能正确地做到这一点?

【问题讨论】:

本次会话在哪里到期? @Milad 它应该在 2 小时后自行过期。我希望自动忘记此会话。 你在config/session.php文件中设置了定时器吗? @Milad 在 config/session.php 中设置为'lifetime' => env('SESSION_LIFETIME', 120), 如果您对配置文件进行了任何更改,请尝试php artisan optimize 重新加载缓存 【参考方案1】:

您可以使用setput 方法设置会话

Session::put('name','value');

使用 get 检索它

Session::get('name')

所以在你的情况下你需要设置你的会话使用

Session::put('request_has_been_sent','yes');

并检查它是否设置或不使用

if(Session::get('request_has_been_sent'))

文档:https://laravel.com/docs/5.0/session

【讨论】:

令人惊讶的是Session::has() 在这种情况下不能用于检查会话!! @nagidi Session::has() 检查之前是否设置了会话,没有任何值,如果设置了,它将返回 true。但使用 Session::get() 将检索会话的值。所以如果它没有任何值,那么它将返回false。在您的情况下,您需要确保在 2 小时后从会话 request_has_been_sent 中删除值。【参考方案2】:

我认为您在这里唯一的问题是没有将会话值设置为您需要设置的任何值,否则 laravel 将忽略它。

Session::put('request_has_been_sent', true);

// Check if it exists, this will check if it exists without getting it
Session::has('request_has_been_sent')

【讨论】:

【参考方案3】:

一旦用户注销,用户会话将被清除。这意味着用户和创建和WithdrawWallet 并注销然后再次登录,然后用户可以创建另一个WithdrawWallet 以便修复您可以使用缓存

$cacheKey = WithdrawWallet::class.'.'.auth()->user()->usr_id;

    if (Cache::has($cacheKey)) 
        return redirect()->back()->with('error', 'You just submitted a request and cannot submit a new one');
     else 
        $withDraw =  Cache::remember($cacheKey, now()->addHours(2), function () use ($request)
            return  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,
            ]);
        );
    
    

    return redirect()->back()->with('success', 'Your request was sent');

【讨论】:

以上是关于会话 put 似乎无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

二进制数据上的 file_put_contents 无法正常工作

Spring Data REST - PUT 请求自 v.2.5.7 以来无法正常工作

未能在会话中存储 CSRF 令牌!可能会话无法正常工作

会话变量无法正常工作我该如何改进

CodeIgniter 会话 ID 更改且无法正常工作

Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作