【问题标题】:Can I make a session alive after when user closes his browser?用户关闭浏览器后,我可以使会话保持活动状态吗?
【发布时间】:2016-06-27 16:07:27
【问题描述】:

我正在尝试实施一个系统来让用户在一段时间内保持登录状态。我可以通过使用 cookie 并将其存储到数据库中然后识别他来做到这一点。

但最近我听说即使用户关闭浏览器并打开一个新窗口,会话也可以处于活动状态。我的意思是再次关闭/打开浏览器后会话是否仍然可用(甚至多次)


我可以在以下脚本中使用$_SESSION["LoginValidation"] 多少时间(最多)

<?php
session_start();
$_SESSION["LoginValidation"] = ture;

目前该会话将在关闭浏览器之前可用。

【问题讨论】:

  • 没办法回答。会话生命周期可根据 php 进行配置。默认设置为仅用于浏览器会话,但您可以设置任何您想要的到期时间。但是即使会话文件仍然存在于您的服务器上,客户端浏览器中的会话 COOKIE 也可能会提前消失。例如您将拥有一个孤立的会话文件。
  • @MarcB “但是你可以设置任何你想要的过期时间” ..!因此,即使用户关闭浏览器,我也可以在服务器上保持会话处于活动状态。对吗?
  • 是的。 cookie 可以在与会话文件本身不同的时间到期。有两个有效期。 'client-side delete'(擦除cookie,会丢失sessioN),或者server-side delete(删除会话文件-客户端仍然有cookie,但现在引用一个不存在的会话文件)

标签: php session


【解决方案1】:

为了使会话在关闭浏览器后持续存在,您需要为会话 cookie 设置过期时间。 没有过期时间的 cookie 在浏览器关闭时被删除,通常称为会话 cookie(这与 PHP 会话不同 - 只是相关)。

(旁注:如果您的浏览器被配置为在退出时“保存打开的标签页”,那么会话 cookie 可能会被浏览器保存,即使它们应该被删除)

所以您可以session.cookie_lifetime 设置为一个较大的值。但这并不能阻止存储在您的服务器上的会话数据被删除 - 要使数据保留更长时间,您需要提高 session.gc_maxlifetime 的值。

但这是解决问题的错误方法

实施此类持久会话存在安全性和容量方面的问题 - 您绝对不应将此作为默认行为实施 - 只有在用户明确表示同意的情况下。

使用“记住我”cookie 作为一种轻量级会话系统是最佳实践解决方案。给它一个随机值(建议您使用一个合理可靠的随机数来源,例如base64_encode(openssl_random_pseudo_bytes(64)) 和一个与其他 cookie 不冲突的名称,并将其与您真正希望在实际会话中持久保存的数据一起存储(例如经过身份验证的用户名)。

【讨论】:

  • 更具体的讨论在这里:stackoverflow.com/questions/244882/…
  • 谢谢.. 点赞。所以关闭浏览器后我不能在服务器上存储任何会话,对吧?
  • 如果你这样做,很多事情都会出错。当您在有效的并行会话中获得用户明确且知情的授权时,存储最少的信息可以解决大多数问题。
【解决方案2】:

方法1)session.cookie-lifetime:这是cookie的生命周期,默认为0,表示关闭浏览器时cookie被销毁。您可以通过增加此变量来设置更长的生命周期。 它与服务器时间有关,因此您需要考虑客户端机器和服务器时间的差异。 还有session.gc-maxlifetime,这是会话数据在存储中被视为垃圾并被销毁的时间。

虽然您可以将这些设置设置为相对较高的值并使其正常工作,但我不建议这样做,因为这会在会话存储中留下大量不必要的会话数据,由于 GC 没有收集实际的死会话

或者 另一种方法是即使在关闭浏览器在 db 中保存会话并获取其 id 并通过

在用户 cookie 中设置该 id 后会话仍保持活跃
setcookie("name","value",time()+$int);

这样您就可以从$_COOKIE["name"]; 中获取该值,并使用它从数据库中获取会话变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2012-12-28
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多