会话永远不会过期

问题描述 投票:14回答:3

我在我的网站中使用登录功能与会话。无论用户是否已经注销,我的会话都会在几分钟后过期。现在我想要的是会话应该只在用户注销时过期。如果用户没有注销他的帐户,然后在2-3天后回来,那么他应该会出现登录状态。

我找到了一些例子,他们增加了会话到期的时间,但我希望它只会在用户退出事件时到期,无论他注销的时间如何。

我怎样才能做到这一点?

特别是,这是正确的方法吗?

session_cache_expire(0);
session_start();
php session session-timeout
3个回答
26
投票

在这种情况下,经常使用的解决方案是:

  • 会话持续时间不会太长:如果用户不活动,它将会过期(这就是它的工作方式 - 如果你有很多用户,这对你的服务器来说会更好)
  • 当用户登录时,您设置一个包含他被识别所需内容的cookie
  • 如果他回到网站上(使用cookie,并且没有活动会话),则使用该cookie中包含的信息自动登录,同时重新创建会话。

这条路:

  • 没有充分理由你没有成千上万的会议“活跃”
  • 你保持标准的会话工作方式

并且你有“永不退出”的优势,至少从用户的角度来看。

另请注意,对于“正常”会话,当用户关闭浏览器时,将删除包含会话ID的cookie - 因此,无论会话的生命周期是多长时间,他都将断开连接。 根据我提出的解决方案,您可以设置cookie应保留在用户计算机上的时间;-)

但这意味着,当用户手动注销时,您必须同时删除其会话和cookie - 因此他不会立即重新自动登录。

当然,你必须要小心你在cookie中设置的内容:cookie不是很安全,所以不要在其中存储密码,例如;-)

实际上,这种做事方式是“记住我”这个功能经常起作用的方式;除此之外,您的用户不必选中复选框以激活“记住我”;-)

如果你没有时间开发那种东西,一种非常快速和肮脏的方法是在你的所有页面上使用一些Ajax请求,这只会“ping”服务器上的PHP页面 - 这将保持会话活跃(但这不是一个很好的做事方式:你仍然会在服务器上有很多会话,你会有很多无用的请求......只有当用户不这样做时它才会工作关闭他的浏览器)。


3
投票

单独使用PHP内部会话处理不能这样做。 PHP将始终在会话cookie中发送会话ID,该会话cookie将在用户关闭浏览器时到期。要实现某种自动登录,您需要一些附带的代码,在用户的浏览器上设置更长的cookie,并处理这些cookie的识别以及cookie值与相应用户帐户之间的映射。

请注意,这极大地影响了安全问题,因此您必须处理很多事情。请阅读以下有关可能的自动登录功能如何工作的信息:


0
投票

你在测试时删除了你的cookie吗?是否启用了Cookie?你在代码中的某处破坏了会话吗?

另外,请参阅我对另一篇文章的回答:Quick question about sessions in PHP,它解释了如何保持登录状态。如果您希望用户永远保持登录状态,请不要执行cronjob / sheduled任务。

© www.soinside.com 2019 - 2024. All rights reserved.