2011-12-23 3 views
6

Я создаю приложение Ajax в Symfony2, где пользователь входит в систему, а затем с этой точки вперед все обрабатывается POST-запросами. После определения времени жизни сеанса до 5 минут в config.yml, я столкнулся с проблемой, когда сеанс пользователя был недействительным через 5 минут, даже если они обрабатывают запросы POST. Каждый раз, когда делается запрос, я хотел бы сбросить обратный отсчет до того, как сессия недействительна, но я не уверен, как это сделать эффективно.Как обновить сеанс во время запроса POST?

Метод, о котором я сейчас думаю, пишет слушатель для события kernel.request, проверяя, является ли метод запроса POST, и манипулирует классом сеанса. Я еще этого не делал, но это не похоже на чистое решение, так как слушателю нужно стрелять каждый раз, когда делается запрос.

Вот моя сессия конфигурации:

session: 
    default_locale: %locale% 
    auto_start:  true 
    lifetime:  300 

Любые идеи? Является ли решение простым PHP, а не Symfony?

+0

являются Ajax запросы, сделанные к тому же доменное имя и приложение symfony, как тот, который изначально настроил cookie сеанса? – RobNY

+0

Да, тот же домен, такое же приложение. –

+0

Пожалуйста, добавьте вашу конфигурацию сеанса yml в вопрос. – hakre

ответ

9

Срок службы сеанса - это максимальный возраст. Это контролируется с помощью уже созданного файла cookie, который больше не обновляется со стороны сервера (поскольку сеанс уже установлен). Вы можете просто обновить этот файл cookie вручную, и я думаю, что это сделает его с symfony2.

, вероятно, проще всего регенерировать идентификатор сеанса без уничтожения сессии:

$this->get('session')->migrate(); 

Это должно вызвать обновление на куки сессии.

Возможно похожие вопросы:

+0

Это отлично работает. В конце концов я использовал слушателя на 'kernerl.request'. –

1

Изложить на то, что все готово здесь, вот полный рабочий пример зарегистрирован в качестве запроса ядра слушателя. В этом примере я запрограммировал тайм-аут на 1200 секунд (20 минут). Вы можете пройти в промежуток времени из файла parameters.yml (который является то, что я сделал в производство):

#src\My\AppBundle\Resources\config\services.yml 
kernel_request.listener: 
    class: My\AppBundle\EventListener\KernelRequestListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    arguments: [@security.context, 1200] 

А класс:

#Place in your src\My\AppBundle\EventListener folder 
namespace My\AppBundle\EventListener { 

    use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
    use Symfony\Component\HttpKernel\HttpKernel; 
    use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken; 
    use Symfony\Component\Security\Core\Exception\CredentialsExpiredException; 
    use Symfony\Component\Security\Core\SecurityContextInterface; 

    class KernelRequestListener { 

    /** @var int */ 
    private $maxIdleTime; 

    /** @var SecurityContextInterface */ 
    private $securityContext; 

    function __construct(SecurityContextInterface $securityContext, $maxIdleTime) { 
     $this->securityContext = $securityContext; 
     $this->maxIdleTime = $maxIdleTime; 
    } 

    public function onKernelRequest(GetResponseEvent $event) { 
     if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) { 
      // don't do anything if it's not the master request 
      return; 
     } 

     $session = $event->getRequest()->getSession(); 
     $token = $this->securityContext->getToken(); 

     if ($session !== null && !($token instanceof AnonymousToken) && $token->isAuthenticated()) { 
      $session->start(); 

      if ((time() - $session->getMetadataBag()->getLastUsed()) > $this->maxIdleTime) { 
       throw new CredentialsExpiredException(); 
      } 

      $session->migrate(false, $this->maxIdleTime); 
     } 
    } 
} 
Смежные вопросы