2011-12-23 25 views
6

Symfony2'de bir kullanıcının oturum açtığı bir Ajax uygulaması yapıyorum ve bu noktadan sonra her şey POST istekleri tarafından ele alındı. Oturum ömrünü config.yml numaralı telefondan 5 dakikaya tanımladıktan sonra, kullanıcı oturumunun POST istekleri oluşturmasına rağmen 5 dakika sonra geçersiz kılınması sorunuyla karşılaşıyorum. Bir istek yapıldığında, oturumun geçersiz hale gelmesinden önce geri sayımı sıfırlamak istiyorum, ancak bunu nasıl verimli bir şekilde yapacağımı bilmiyorum.POST isteği sırasında oturumu nasıl yenileyebilirim?

Şu anda, kernel.request olayı için bir dinleyici yazma kontrol istek yöntem POST ise ve oturum sınıfını manipüle edilir düşünüyorum yöntemi. Bunu henüz yapmadım, ama temiz bir çözüm gibi görünmüyor, çünkü dinleyici her isteğin üzerine ateş açıyor.

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

Herhangi bir fikir:

İşte benim oturumu yapılandırma var? Çözüm düz PHP ve Symfony değil mi?

+0

aynı yapılıyor ajax istekleri Are You (I üretimini yaptıklarını olan) sizin parameters.yml dosyasından süreyi geçebilir Başlangıçta oturum çerezini ayarlayan alan adı ve symfony uygulaması? – RobNY

+0

Evet, aynı alan adı, aynı uygulama. –

+0

Lütfen yml oturum yapılandırmanızı soruya ekleyin. – hakre

cevap

9

bir oturumun ömrü maksimum yaş olduğunu. Bu, daha önce oluşturulmuş ve sunucu tarafında artık yenilenmeyen bir çerez aracılığıyla kontrol edilir (çünkü oturum zaten kuruldu). Bu çerezi el ile güncelleyebilirsiniz ve sanırım bunu symfony2 ile yapacağız.

muhtemelen en kolay w/oturumu yok o session id yeniden şudur:

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

Bu oturum çerezinin bir güncelleme tetiklemesi.

Muhtemelen ilgili sorular: Burada her hazırdır üzerine ne onu açıklamak

+0

Bu harika çalışıyor. Sonuçta 'kernerl.request' üzerinde bir dinleyici kullanarak bitirdim. –

1

, burada bir çekirdek isteği dinleyicisi olarak kaydedilen tam bir çalışma örneği. Bu örnekte, zaman aşımını 1.200 saniyeye (20 dakika) kodladım.

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

Ve sınıfı:

#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); 
     } 
    } 
}