在Laravel中检查会话超时

24

我想知道有没有人知道如何在Laravel中检查会话超时。

您可以检查会话是否有特定的项目:

if (Session::has('name'))
{
     $name = Session::get('name');
}

但是您无法检查会话是否已过期。如果能够更具体地向用户报告,那将是很好的。"您的会话已超时,请重新开始。"

有任何想法吗?

4个回答

29

只需使用与会话类本身相同的逻辑。

if ((time() - Session::activity()) > (Config::get('session.lifetime') * 60))
{
   // Session expired
}

将此代码放入您的“before”过滤器中-它将在每个请求上运行。


4
哇,我以前从没见过 ::activity()。这个在哪里有说明文档? - mattl
16
没有文档记录 - 我只是去了课程班并查看了所有函数,试图找出解决您问题的答案 :) - Laurence
有人能帮我解决这个问题吗?我遇到了这个错误:Undefined index: last_activity代码在这里:http://paste.laravel.com/gU5 - OneSneakyMofo
3
为什么会出现“Call to undefined method Illuminate\Session\Store::activity()”的错误?我使用的是Laravel 4版本。请帮忙翻译。 - giannis christofakis
4
“activity”方法似乎已经从Laravel中消失了。在Laravel.io上记录了另一种替代方法。 - bishop
显示剩余5条评论

2

为什么不这样做呢?

if (!Session::has('name'))
{
     $sessionTimeout = 1;
}

如果会话超时,那么名称将不再设置。您可以编写一些代码来响应 $sessionTimeout == 1;


这并不完全符合我的意图,因为我试图检查是否有一个项目集,但已经没有时间了,而不仅仅是检查它是否存在。 - mattl

0

顺便说一下,如果你需要会话生命周期,

可以使用这个:

{{ session('lifetime') }}

当描述此内容时,

请使用此代码:

session(['User' => $user, 'lifetime' => 3600]);

0
在Laravel 8及以后的版本中,最好的解决方案似乎是这样的:
if(session()->missing("name") && session()->missing("email")) {
   // Replace with your own logic to handle the missing session       
   throw SessionNotFoundException;
}

...在这里,nameemail都是两个应该始终存在于会话中的会话键。检查两个键更加健壮,可以防止由于错误导致其中一个键缺失时触发条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接