如何在 Symfony 中延长会话 cookie 的生命周期?

Posted

技术标签:

【中文标题】如何在 Symfony 中延长会话 cookie 的生命周期?【英文标题】:How to extend session cookie lifetime in Symfony? 【发布时间】:2017-07-23 17:56:27 【问题描述】:

在服务器端访问会话数据时,其modified_time 被设置,因此将其过期时间延长到未来。

但是,phpSESSID cookie 不会发生这种情况。虽然服务器端的会话数据过期时间延长了,但 cookie 过期时间没有延长。如果 cookie 过期,用户将失去他的会话 - 他在发送请求时将没有会话 ID。

有没有办法告诉Symfony\Component\HttpFoundation\Session\Session 延长cookie 的有效期?

可以对相同的会话 ID 执行此操作吗?还是我们必须重新生成它(对于许多用户 X 许多请求来说似乎效率低下)? 我是否应该自己手动设置(忽略 OOP 原则)

我找到了$request->getSession()->getMetadataBag() 并尝试设置stampNew(),但这似乎与PHPSESSID cookie 没有交互。

【问题讨论】:

我认为 PHPSESSID cookie 被设置为会话 cookie,这意味着浏览器在关闭时会清理它。从来没有听说过在浏览器会话完成之前清理它。 我不需要删除它,我需要延长它的有效期。它不会在关闭浏览器时被清除 - cookie 的寿命会更长(我猜有点像 REMEMBERME) 我的意思是(基于the manual,会话的默认持续时间是“只要浏览器打开”)。现在,如果浏览器不清理会话 cookie 并将它们保留更长时间(通常是这种情况),则不是基于默认的 PHP 配置。无论如何,PHP 会话并不意味着在浏览器会话之后持续存在,也许您可​​以使用不同的会话管理器和您自己的自定义 sessionid cookie 来使会话持续更长时间。 【参考方案1】:

您可以在会话密钥下的config.yml文件中进行更改,例如:

# session configuration
session:
    cookie_lifetime:    3600

来自文档:

cookie_lifetime

类型:整数默认值:null

这决定了会话的生命周期 - 以秒为单位。默认 value - null - 表示 session.cookie_lifetime 值来自 将使用 php.ini。将此值设置为 0 意味着 cookie 是 在浏览器会话的长度内有效。

更多信息在文档here

【讨论】:

我知道这个设置,我需要知道的是如何在每次页面访问时“碰撞”cookie过期时间,因为服务器上会话数据的过期时间是“碰撞”的“在每一个请求上。同样只要继续访问该站点,您的会话应该在定义的生命周期内保持活动状态,即使在您关闭浏览器(然后重新打开)之后也是如此。只有当您在lifetime 秒内没有访问该站点时,它才会死掉。

以上是关于如何在 Symfony 中延长会话 cookie 的生命周期?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法阻止 Symfony2 为某些路径发送会话 cookie?

XSS利用之延长Session生命周期

如何在opencart中延长会话超时[重复]

Symfony 会话不可用异常

cookie和session

Symfony 4 会话过期太快