2015-11-03 2 views
0

В моем приложении используется ajax для запроса данных. Я использую Symfony2, и когда сеанс истекает, и я делаю запрос с ajax, форма входа отображается в основной области моего приложения, а не как другое представление, как должно быть. Как решить эту проблему. БлагодаряSession Expire Symfony 2 Ajax

ответ

2

Я хотел бы предложить создание слушателя событий, который будет прослушивать для каждого запроса:

services.yml:

your_request_listener: 
    class: Acme\AppBundle\EventListener\RequestListener 
    arguments: [@security.token_storage] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onRequest } 

В этом случае слушатель я хотел бы проверить тип запроса, так это будет быть только слушателем запроса Ajax. Когда запрос является ajax-типом, тогда я бы проверял, закончился ли сеанс - если это так, я бы создал ответ, который будет действительным ответом на запрос ajax (т. Е. JsonResponse) и установите этот ответ для отправки пользователю.

class RequestListener 
{ 
    private $tokenStorage; 

    public function __construct(TokenStorageInterface $tokenStorage) 
    { 
     $this->tokenStorage = $tokenStorage; 
    } 

    public function onRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if (!$request->isXmlHttpRequest()) { 
      return; //we dismiss requests other than ajax 
     } 

     //now you check if user is authenticated/session expired/whatever you need 
     $token = $this->tokenStorage->getToken(); 
     if ($token === null) { 
      //now you create response which you would expect in your js doing ajax, for example JsonResponse 
      $response = new JsonResponse(); //you should give some content here 
      $event->setResponse($response); //now you override response which will be sent to user 
     } 

    } 
} 
0

Вы можете использовать entry point, в котором вы проверить, если запрос является запрос AJAX. Если да, вы возвращаете ответ JSON с кодом состояния 401 HTTP. Затем в JS-коде вы проверяете код состояния HTTP. Если 401, перейдите на страницу входа.

Вы можете прочитать мое сообщение here с полным решением (см. Мой собственный ответ на мой вопрос). Это решение основано на этом превосходном post.

Смежные вопросы