在 laravel 中会话超时或过期后触发函数

Posted

技术标签:

【中文标题】在 laravel 中会话超时或过期后触发函数【英文标题】:Trigger function after session timeout or expire in laravel 【发布时间】:2015-04-23 23:06:38 【问题描述】:

您好,我是 laravel 的新手,我有一个关于身份验证的问题。我的身份验证控制器中有以下功能:

public function signout()
     
        // set logged in status to zero in database
        $l = Login::where('user_id', Session::get('user')->user_id)
                ->where('logged_in', 1)->first(); 
        $l->logged_in = 0;
        if ($l->save())
        
            // log user out
            Auth::logout();
            // Forget user session data
            Session::forget('user');
            // redirect user to login page
            return Redirect::to('/account/signin');
        
    

现在在我的会话配置中,我已将会话设置为在 60 分钟后过期,之后用户显然会从系统中注销。但是,如果我没有执行其他功能,例如在数据库中将用户登录状态设置为零或忘记用户会话数组,就会发生这种情况。有没有办法在登录会话到期后触发这些功能执行?提前谢谢你。

更新:自从我对我的问题投反对票以来,我一直在环顾四周,看看是否已经有解决方案,通过阅读文档,当我来到“事件”部分时我很兴奋,因为我以为我找到了解决方案,但后来我发现 laravel 中没有“Session::expire”事件,也没有检查其他用户是否登录的功能。

【问题讨论】:

请在投反对票时附上评论让我理解。 我整天都在网上寻找解决方案,从会话过期事件到解码会话数据和检索用户 ID,这么多想法都没有导致一个可行的解决方案,我的猜测是没有,所以我得想点别的。 这是个好问题。我还需要您(经过 9 个月的询问)正在搜索的内容。我希望你找到任何解决方案。请在这里分享。我正在使用 laravel 5.1。你的问题值得投票 @user3718908 您不应该使用整数来定义用户是否登录。一个更好的方法是一个时间戳,每次用户加载页面时都会得到一个时间戳,只要时间戳值超过 60 分钟,也就是说,time() - strtotime($user->last_activity_at) > 3600 据说用户已注销!会话数组删除部分由 Laravel 自己处理! 【参考方案1】:

您的整个前提是错误的:会话应该有一个到期时间戳,该时间戳在用户登录时设置,并且如果您想要“会话在 1 小时不活动后超时”之类的内容,则在每次请求时更新。

那么你基本上可以:

    通过检查时间戳检查用户执行请求时会话是否仍然有效 使用计划任务删除过期会话,让后台保持干净整洁

无论如何,如果由于某种原因最终需要在用户注销时触发某些操作,Laravel 实际上有一个在用户注销时触发的事件:'auth.logout'

【讨论】:

以上是关于在 laravel 中会话超时或过期后触发函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中设置会话超时?

会话超时后的 laravel csrf 令牌不匹配异常

修复 laravel 5 会话在刷新或进入另一个页面后过期?

Laravel 身份验证会话超时

在 Laravel 中检查会话超时

laravel 8 +惯性js中的会话超时