会话本身不应过期

2022-08-31 00:41:39

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

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

我该怎么做?

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

session_cache_expire(0);
session_start();

答案 1

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

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

这边:

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

而且您具有“永不注销”的优势,至少从用户的角度来看是这样。

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


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


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


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


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


答案 2

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

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


推荐