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

Как мога да попреча на CakePHP 3.x да удължи потребителската ми сесия, когато към сървъра се правят фонови ajax извиквания? Аз също използвам $.ajax() на jquery.

Имам 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
Работи перфектно. Добавих още една проверка, за да видя дали е зададен параметър на низ на заявка, за да мога да разреша на ajax ping заявка за удължаване на сесията. Имам някакъв javascript за наблюдение на сесии, който разширява сесията, ако са активни на страницата с формуляра. Ако оставят неизпратена работа на страницата, имам специален изскачащ прозорец, който им позволява да се удостоверят отново, за да не загубят работата си. Имах скрипт за известяване на потребителя, който проверяваше за нови известия, което всъщност удължаваше сесията завинаги, което не позволяваше автоматичното излизане след X минути да работи. - person darensipes; 23.09.2015