我的应用程序使用ajax来请求数据。我正在使用Symfony2,当会话到期并且我使用ajax发出请求时,登录表单显示在我的应用程序的主区域内,而不是应该是另一个视图。怎么能解决这个问题。感谢
答案 0 :(得分: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
}
}
}
答案 1 :(得分:0)
您可以使用entry point验证请求是否是AJAX请求。如果是,则返回带有401 HTTP状态代码的JSON响应。然后在JS代码中验证HTTP状态代码。如果是401,则重定向到登录页面。