会话终止symfony2ajax

会话终止symfony2ajax,ajax,symfony,session,login,Ajax,Symfony,Session,Login,我的应用程序使用ajax请求数据。我使用的是Symfony2,当会话到期并使用ajax发出请求时,登录表单显示在应用程序的主区域内,而不是应该显示的另一个视图。如何解决这个问题。谢谢我建议创建事件侦听器,它将侦听每个请求: 服务。yml: your_request_listener: class: Acme\AppBundle\EventListener\RequestListener arguments: [@security.token_storage] tags:

我的应用程序使用ajax请求数据。我使用的是Symfony2,当会话到期并使用ajax发出请求时,登录表单显示在应用程序的主区域内,而不是应该显示的另一个视图。如何解决这个问题。谢谢

我建议创建事件侦听器,它将侦听每个请求:

服务。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
        }

    }
}
您可以使用验证请求是否为AJAX请求的。如果是,则返回带有401 HTTP状态代码的JSON响应。然后在JS代码中验证HTTP状态代码。如果是401,则重定向到登录页面

您可以阅读我的文章,并提供完整的解决方案(请参阅我对自己问题的回答)。这个解决方案就是基于这个优秀的解决方案