25

所以这个问题的关键是如何防止 CakePHP 仅在一段时间不活动后取消对会话的身份验证。

所以,如果用户什么都不做,那么我希望 CakePHP 在 30 分钟后将他们注销。但是,如果用户选择在第 28 分钟不活动时访问页面,那么 CakePHP 应该“重置”它的超时计数器。

这目前没有发生。无论活动如何,CakePHP 在我的核心配置 (app/Config/core.php) 中的指定时间后都会超时。

这是我的配置代码:

Configure::write('Session', array(
    'defaults' => 'cake',
    'timeout' => '30'
));

有任何想法吗?

4

5 回答 5

28

遇到同样的问题后,我发现这是由 Session.cookieTimeout 值引起的。尽管 php 会话仍然有效,但会话 cookie 上的到期日期不会被刷新。

现在这是我的会话配置

Configure::write('Session', array(
        'defaults' => 'php',
        'timeout' => 30, // The session will timeout after 30 minutes of inactivity
        'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
        'checkAgent' => false,
        'autoRegenerate' => true, // causes the session expiration time to reset on each page load
    ));
于 2013-05-21T10:19:12.197 回答
8

虽然该timeout值会在每次网页浏览时重置并因此提供您需要的“不活动超时”,但浏览器的会话 cookie 到期日期保持不变。

因此,如果您在第 28 分钟 + 第 35 分钟刷新,Cake 会话将在内部(内部 = Cake 内部)仍然存在,但浏览器最终会在第 30 分钟后删除会话 cookie。

您可以通过 重置会话 cookie 到期日期$this->Session->renew()。或者设置autoRegenerate = truerequestCountdown = 1蛋糕将在每次浏览量上更新。

(但是,您必须在每次页面查看时重新生成会话,这有点愚蠢。因为,如果没有renew(),该timeout值将永远不会发挥作用,因为无论有多少活动,cookie 都会在固定日期过期。这似乎就像一个错误,但我还没有研究过解决方法。)

于 2013-01-23T05:35:38.380 回答
4

我遇到了同样的问题,我使用以下autoRegenerate选项修复了它:

Configure::write(
    'Session',
    array(
        'defaults' => 'cake',
        'timeout' => '30',
        'autoRegenerate' => true
    )
);

你也可以$this->Session->renew();在你的AppController.php课堂上使用,但上面的解决方案是我最喜欢的。

于 2013-01-23T04:03:46.507 回答
2

Rob Forrest 的答案是正确的

Configure::write('Session', array(
        'defaults' => 'php',
        'timeout' => 30, // The session will timeout after 30 minutes of inactivity
        'cookieTimeout' => 1440
));

如果您希望会话仅在不活动时过期,则 cookieTimeout 应该大于 timeout 然后您需要将 cookieTimeout 设置为非常大的数字(例如 60*24*10(10 天))

于 2014-04-06T07:51:13.573 回答
0
    Configure::write('Session', array(
    'defaults' => 'cake',
    'timeout' => 1440, // The session will timeout after 30 minutes of inactivity
    'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
    'checkAgent' => false,
    'autoRegenerate' => true, // causes the session expiration time to reset on each page load
));

这很有效,尽管会话在几个小时后结束,但它仍然比在几分钟内结束要好。

于 2015-02-20T09:29:31.453 回答