2011-12-23 16 views
6

Buduję aplikację Ajax w Symfony2, w której loguje się użytkownik, a następnie od tego momentu wszystko jest obsługiwane przez żądania POST. Po zdefiniowaniu czasu trwania sesji do 5 minut w config.yml, napotkam problem z unieważnieniem sesji użytkownika po 5 minutach, nawet jeśli wysyłają żądania POST. Za każdym razem, gdy jest żądanie, chciałbym zresetować odliczanie przed unieważnieniem sesji, ale nie jestem pewien, jak to zrobić skutecznie.Jak mogę odświeżyć sesję podczas żądania POST?

Metoda, o której obecnie myślę, to napisanie detektora dla zdarzenia kernel.request, sprawdzenie, czy jest to metoda POST i manipulowanie klasą sesji. Nie zrobiłem tego jeszcze, ale nie wydaje się to być czystym rozwiązaniem, ponieważ słuchacz musi strzelać za każdym razem, gdy zostanie złożone żądanie.

Oto moja sesja config:

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

Jakieś pomysły? Czy rozwiązanie to zwykły PHP, a nie Symfony?

+0

stanowią Ajax żądań do samo nazwa domeny i aplikacja symfony jako ta, która pierwotnie ustawiła plik cookie sesji? – RobNY

+0

Tak, ta sama domena, ta sama aplikacja. –

+0

Proszę dodać konfigurację sesji yml do pytania. – hakre

Odpowiedz

9

Żywotność okresu sesji sesji to maksymalny wiek. Jest to kontrolowane za pomocą pliku cookie, który został już utworzony i nie jest już odświeżany od strony serwera (ponieważ sesja została już ustanowiona). Możesz po prostu zaktualizować ten plik cookie ręcznie i myślę, że zrobi to z symfony2.

prawdopodobnie najłatwiej jest do regeneracji identyfikator sesji w/o niszczenie sesji:

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

ta powinna wywołać aktualizację cookie sesji.

prawdopodobnie związane pytania:

+0

Działa to świetnie. Ostatecznie ostatecznie użyłem detektora na 'kernerl.request'. –

1

wyłożyć po co to wszystko gotowy tutaj, tutaj jest pełna przykładów pracy zarejestrowana jako wniosek jądro słuchacza. W tym przykładzie zakodowałem limit czasu do 1200 sekund (20 minut). można przekazać w czasie z pliku parameters.yml (czyli to, co zrobiłem w produkcji):

#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] 

A klasa:

#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); 
     } 
    } 
} 
Powiązane problemy