2011-12-23 31 views
6

Tôi đang xây dựng một ứng dụng Ajax trong Symfony2 nơi người dùng đăng nhập và sau đó từ đó mọi thứ được xử lý bởi các yêu cầu POST. Sau khi xác định thời lượng phiên là 5 phút trong config.yml, tôi gặp sự cố phiên của người dùng bị vô hiệu sau 5 phút mặc dù họ đang thực hiện yêu cầu POST. Mỗi lần yêu cầu được thực hiện, tôi muốn đặt lại đếm ngược trước khi phiên không hợp lệ, nhưng tôi không chắc chắn cách thực hiện điều này một cách hiệu quả.Tôi làm cách nào để làm mới phiên trong khi yêu cầu POST?

Phương pháp tôi hiện đang nghĩ đến là viết trình nghe cho sự kiện kernel.request, kiểm tra xem phương thức yêu cầu có POST hay không và thao tác với lớp phiên. Tôi đã không làm điều này được nêu ra, nhưng nó không có vẻ giống như một giải pháp sạch, vì người nghe cần phải cháy mỗi khi một yêu cầu được thực hiện.

Dưới đây là cấu hình phiên của tôi:

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

Bất kỳ ý tưởng? Là giải pháp đồng bằng PHP và không Symfony?

+0

Are yêu cầu ajax được thực hiện với cùng tên miền và ứng dụng symfony là ứng dụng ban đầu đã thiết lập cookie phiên? – RobNY

+0

Đúng, cùng một miền, cùng một ứng dụng. –

+0

Vui lòng thêm cấu hình phiên yml của bạn vào câu hỏi. – hakre

Trả lời

9

Tuổi thọ của phiên là độ tuổi tối đa. Điều này được kiểm soát thông qua một cookie đã được tạo và không được làm mới nữa từ phía máy chủ (vì phiên đã được thiết lập). Bạn chỉ có thể cập nhật cookie này theo cách thủ công và tôi nghĩ điều này sẽ làm cho nó với symfony2.

Các lẽ đơn giản nhất là để tạo lại id phiên w/o phá hủy phiên họp:

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

này nên kích hoạt cập nhật trên cookie phiên.

câu hỏi liên quan Có lẽ:

+0

Công trình này tuyệt vời. Tôi đã kết thúc bằng cách sử dụng một người nghe trên 'kernerl.request' sau khi tất cả. –

1

Để expound vào những gì là tất cả sẵn sàng ở đây, đây là một ví dụ làm việc hoàn tất đăng ký như là một người biết lắng nghe yêu cầu kernel. Trong ví dụ này, tôi đã mã hóa cứng thời gian chờ thành 1.200 giây (20 phút). Bạn có thể vượt qua trong khoảng thời gian từ file parameters.yml của bạn (đó là những gì tôi đã làm trong sản xuất):

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

Và các lớp:

#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); 
     } 
    } 
} 
Các vấn đề liên quan