防止会话在非活动用户的 PHP 会话中过期

Posted

技术标签:

【中文标题】防止会话在非活动用户的 PHP 会话中过期【英文标题】:Prevent session expired in PHP Session for inactive user 【发布时间】:2011-08-23 04:33:50 【问题描述】:

我的申请有问题:我的申请有很多表格,需要大约 1 小时才能完成这个表格,因为表格是动态的(可以添加其他表格)。问题是:我的网络服务器的会话是 24 分钟。当用户填写表格时,他们花了很多时间并且会话超时,因为服务器识别出用户处于非活动状态。提交表单时非常烦人,大部分数据丢失,用户返回登录页面。我尝试使用以下代码使我的会话在 10 小时内过期:

ini_set('session.gc_maxlifetime', '36000');

但它在我的服务器上不起作用,我的服务器是否可能阻止ini_set() 功能?

那么,我应该怎么做才能解决这个问题呢?我可以防止会话超时,以便将会话扩展到 10 小时吗?或者我可以禁用会话过期吗?

谢谢

【问题讨论】:

您可以基于cookies和数据库或文件实现自己的会话系统。 请选择一个答案作为您的主题的答案。 @jcubic -> 是的,先生,我已经实现了 cookie。因此,如果会话过期,cookie 仍然保存登录数据,但是当用户提交表单时,页面重定向到起始页面(登录成功时我们首先查看的页面)。重定向路由是form page (when submit, session expired) -> login page (if cookies true) -> starting page,所以数据丢失了 我的意思是,不要使用 $_SESSION (session_start) 使用 cookie 并将变量保存在数据库或文件中。当用户登录时创建一个令牌并将其保存在 cookie 中并基于此令牌存储您的变量。 【参考方案1】:

不要将 ini 中的时间设置为固定长度,而是提醒会话超时在重新加载时重置。因此,创建一些每 5 分钟左右对文件(图像或 smth)执行一次请求的 ajax 代码。这样,计时器每 5 分钟重置一次,用户可以花一天时间填写您的表单。

【讨论】:

不敢相信迄今为止解决该问题的最佳解决方案之一已经获得了 0 个支持 -.- 只是增加会话寿命应该是最糟糕的解决方案 - 这是一个巨大的安全风险而且我从来没有见过 每个 用例必须有一个长期会话业务逻辑的 Web 应用程序......所以,对需要它的用例进行一些 ajax 调用,然后离开服务器端的会话超时时间 untouched !哎呀... 能给个示例代码吗?我没有使用 ajax 的经验。 这里是例子:***.com/questions/12597176/… 那么现在 chrome 暂停后台标签会发生什么?【参考方案2】:

这是一个使用 jQuery Ajax 调用防止会话超时的示例:

var refreshTime = 600000; // every 10 minutes in milliseconds
window.setInterval( function() 
    $.ajax(
        cache: false,
        type: "GET",
        url: "refreshSession.php",
        success: function(data) 
        
    );
, refreshTime );

在 refreshSession.php 中,您可以执行类似 session_start()

的操作

【讨论】:

最佳答案,instagram 和 facebook 使用这种方法 这是一个不错的答案,但我不明白在该脚本上执行 session_start 的建议,因为例如在我的案例中 session_start 已经发生。有人可以向我澄清这一点吗? 这个没有会话脚本。这是让您的用户从您的服务器加载某些内容的 javascript。 (刷新Sesson.php)。该代码是 Javascript 并且看起来正在使用 jQuery。假设您的 refreshSession.php 文件中有 session_start,用户(在本例中为 ajax 调用)点击刷新页面将重新启动会话。【参考方案3】:

我过去也遇到过同样的问题。为了解决这个问题,我将这两个函数放在一个配置文件中,该文件包含在每个文件中。

session_set_cookie_params(86400);
ini_set('session.gc_maxlifetime', 86400);

只是为了安全测量我的 .htaccess 文件中的这一行

php_value session.gc_maxlifetime 86400

【讨论】:

我有:session.cookie_lifetime = 200000; session.gc_maxlifetime = 600000。但是这无济于事,并且数据有时会在表单提交时丢失。请问有什么想法吗?【参考方案4】:

使用ini_set 更改session.gc_maxlifetime 应该可以工作,只要您在调用session_start 之前更改选项。因此,执行以下操作应该可以:

ini_set('session.gc_maxlifetime', 36000);
session_start();

您还可以在其他情况下更改该选项(请参阅ChazUK’s answer)。

但我不会将 cookie 的生命周期设置为固定值,而是将会话的 cookie 设为真正的session cookie,持续到浏览器会话结束(即在浏览器关闭时)。您可以通过将 session.cookie_lifetime 设置为 0 来做到这一点。

还要考虑PHP’s session expiration model is a little quirky,因为生命周期计算是基于会话数据的最后修改日期。

【讨论】:

1 在session_start(); 之前尝试过使用ini_set('session.gc_maxlifetime', 36000);,但它在我的服务器上不起作用。我在超过 24 分钟内忽略了我的网站,当我刷新它时,它会重定向到登录页面。我的服务器有可能阻止 ini_set() 函数吗?要不然是啥?谢谢楼主 好吧,我明白了,ini_set('session.gc_maxlifetime', '36000'); 和 ini_set('session.gc_maxlifetime', 36000); 之间有什么不同吗?先生 ?看数字单引号:) 我在数字中使用单引号:D @dian:不,在这种情况下是否使用引号没有任何区别。但是你检查会话ID是否相同?【参考方案5】:

会话 cookie 的持续时间在您创建会话 cookie 时设置。如果您使用 setcookie 方法,该方法的参数是您希望 cookie 持续的 LENGTH。

更多信息请参考PHP手册中的方法: http://php.net/manual/en/function.setcookie.php

【讨论】:

以上是关于防止会话在非活动用户的 PHP 会话中过期的主要内容,如果未能解决你的问题,请参考以下文章

如何防止模态框关闭?

如何防止 Ajax 调用使会话保持活动状态?

如何防止会话在顶点过期?

保持 ASP.NET 会话打开/活动

如何防止 Laravel 中的会话/cookie 刷新?

如何在 10 分钟不活动后使 PHP 会话过期? [复制]