如何防止 CakePHP 3.0 使用 ajax 请求延长会话超时?

How to prevent CakePHP 3.0 from extending session timeout with ajax requests?

如何防止 CakePHP 3.x 在对服务器进行后台 ajax 调用时延长我的用户会话?我也在使用 jquery 的 $.ajax() 。

我有一个 setInterval 运行 每分钟一次来获取一些用户通知。我的应用程序是 EHR,我需要保持严格的会话超时。我的获取通知 Javascript 基本上只是让我的会话不受限制,因为 ajax 调用正在延长会话。

我认为几周前在 CakePHP 书中看到过关于此的内容,但我今天似乎找不到了。

谢谢, 达人

一般来说,这是需要您自己处理的事情,即实现您自己的超时机制。具体怎么处理,看情况。

您只想排除 AJAX 背景 activity,因此您需要能够访问请求对象,并且您很可能希望尽早处理此问题。鉴于此先决条件,我可能会使用调度程序过滤器,您可以在其中根据当前请求是否为 AJAX 请求来延长超时时间,并在涉及任何控制器之前销毁会话。

这是一个非常基本的、几乎不言自明的示例,它假设 timeout 选项值设置为 session configuration

src/Routing/Filter/SessionTimeoutFilter.php

namespace App\Routing\Filter;

use Cake\Core\Configure;
use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;

class SessionTimeoutFilter extends DispatcherFilter
{
    public function beforeDispatch(Event $event)
    {
        /* @var $request \Cake\Network\Request */
        $request = $event->data['request'];

        $session = $request->session();
        $lastAccess = $session->read('SessionTimeoutFilter.lastAccess');

        if (
            $lastAccess !== null &&
            time() - $lastAccess > Configure::read('Session.timeout') * 60
        ) {
            $request->session()->destroy();
        }

        if (!$request->is('ajax')) {
            $session->write('SessionTimeoutFilter.lastAccess', time());
        }
    }
}

src/config/bootstrap.php

DispatcherFactory::add('SessionTimeout');

根据您的具体需要,您当然可以将类似的代码放在应用程序中几乎任何您可以访问请求对象的地方。