Как правило, это то, с чем вам нужно справиться самостоятельно, т.е. реализовать собственный механизм тайм-аута. Как с этим справиться, зависит.
Вы хотите исключить только фоновую активность 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