16

我在我的站点中使用会话登录功能。无论用户是否注销,我的这个会话都会在几分钟后过期。现在我想要的是会话应该只在用户注销时过期。如果用户没有注销他的帐户,然后在 2-3 天后回来,即使这样,他也应该显示为已登录。

我发现了一些示例,它们增加了会话到期的时间,但我希望它只应在用户注销事件时到期,而不管他注销所花费的时间。

我怎样才能做到这一点?

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

session_cache_expire(0);
session_start();
4

3 回答 3

28

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

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

这边走:

  • 您没有充分的理由没有“活跃”的数千个会话
  • 你保持会话工作的标准方式

至少从用户的角度来看,您具有“永远不会被注销”的优势。

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


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


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


实际上,这种做事方式就是“记住我”功能通常的工作方式;除了,在这里,您的用户不必选中复选框来激活“记住我”;-)


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

于 2009-08-25T10:28:21.133 回答
3

您不能仅通过 PHP 内部会话处理来做到这一点。PHP 将始终在会话 cookie 中发送会话 id,当用户关闭浏览器时该会话 id 将过期。为了实现某种自动登录,您需要一些附带的代码,在用户浏览器上设置一个更持久的 cookie,并处理这些 cookie 的识别以及 cookie 值和相应用户帐户之间的映射。

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

于 2009-08-25T10:30:01.770 回答
0

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

另外,请参阅我对另一篇文章的回答:关于 PHP 会话的快速问题,它解释了如何保持登录状态。如果您希望用户永远保持登录状态,请不要执行 cronjob/sheduled 任务。

于 2009-08-25T10:29:48.027 回答