Как запретить CakePHP 3.0 увеличивать время ожидания сеанса с помощью ajax-запросов?

Как я могу запретить CakePHP 3.x продлевать сеанс моих пользователей, когда на сервер выполняются фоновые вызовы ajax? Я также использую jquery $.ajax().

У меня setInterval запускается раз в минуту, чтобы получать уведомления пользователей. Мое приложение представляет собой EHR, и мне нужно поддерживать строгий тайм-аут сеанса. Мои уведомления о получении Javascript в основном только что сделал мои сеансы неограниченными, потому что вызовы ajax продлевают сеансы.

Я думал, что видел что-то об этом в книге CakePHP несколько недель назад, но сегодня не могу найти.

Спасибо, Дарен


person darensipes    schedule 30.08.2015    source источник
comment
Итак, что именно вы имеете в виду, когда говорите строгий тайм-аут сеанса? Из заголовка вашего вопроса можно подумать, что вы просто хотите, чтобы фоновые запросы AJAX не влияли на тайм-аут, в то время как активность пользователя на переднем плане должна продлевать сеанс?   -  person ndm    schedule 30.08.2015
comment
Строго в том, что сеанс должен истечь по тайм-ауту через 10 минут бездействия. Таким образом, фоновые Ajax-запросы не должны расширять сеанс. Какие прямо сейчас мои запросы Ajax расширяют сеанс, что в моем случае использования нежелательно.   -  person darensipes    schedule 31.08.2015


Ответы (1)


Как правило, это то, с чем вам нужно справиться самостоятельно, т.е. реализовать собственный механизм тайм-аута. Как с этим справиться, зависит.

Вы хотите исключить только фоновую активность AJAX, поэтому вам нужен доступ к объекту запроса, и вы, скорее всего, захотите обработать это как можно раньше. Учитывая эти предварительные условия, я бы, вероятно, использовал фильтр диспетчера, где вы можете увеличить время ожидания в зависимости от того, является ли текущий запрос запросом AJAX, и уничтожить сеанс до того, как будут задействованы какие-либо контроллеры.

Вот очень простой, не требующий пояснений пример, в котором предполагается, что значение параметра timeout установлено для конфигурация сеанса.

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');

В зависимости от ваших конкретных потребностей вы, конечно, можете разместить аналогичный код практически в любом месте вашего приложения, где у вас есть доступ к объекту запроса.

person ndm    schedule 31.08.2015
comment
Работал отлично. Я добавил еще одну проверку, чтобы увидеть, был ли установлен параметр строки запроса, чтобы я мог разрешить запрос ping ajax для продления сеанса. У меня есть javascript для мониторинга сеанса, который расширяет сеанс, если они активны на странице формы. Если они оставят неотправленную работу на странице, у меня есть специальное всплывающее окно, позволяющее им повторно аутентифицироваться, чтобы они не потеряли свою работу. У меня был сценарий уведомления пользователя, который проверял наличие новых уведомлений, который фактически продлевал сеанс навсегда, что не позволяло работать автоматическому выходу из системы через X минут. - person darensipes; 23.09.2015