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

时间:2015-08-30 16:36:42

标签: jquery ajax cakephp session-cookies cakephp-3.0

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

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

几周前我想在CakePHP书中看到了一些关于此事的内容,但我今天似乎无法找到它。

谢谢, 达人

1 个答案:

答案 0 :(得分:2)

通常,这是您需要自己处理的事情,即实现自己的超时机制。如何处理,取决于。

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

这是一个非常基本的,非常自我解释的示例,它假设为session configuration设置了timeout选项值。

<强>的src /路由/过滤/ 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 /配置/ bootstrap.php中

DispatcherFactory::add('SessionTimeout');

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