在 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 中会话超时或过期后触发函数的主要内容,如果未能解决你的问题,请参考以下文章