限制到 Ajax 调用的路由,在 Symfony 2.6+ 中可以吗?
Restrict routes to a Ajax call, it's possible in Symfony 2.6+?
我正在寻找实现 "automatic" 对 Ajax 呼叫的路由限制的最佳方法。现在我正在做如下:
/**
* @Secure(roles="IS_AUTHENTICATED_FULLY")
* @Route("/someRoute", name="someRoute")
* @Method("POST")
*/
public function eliminarFacturasAction(Request $request)
{
$response['success'] = false;
$status = 400;
if ($request->isXmlHttpRequest()) {
// needs to set $response values and $status=200 all the time
} else {
// needs to handle the exception and return Json response
}
return new JsonResponse($response, $status ?: 200);
}
为了避免这种情况,我可以改用这个吗?
@Route("/someRoute",
name="routeName",
condition="request.headers.get('X-Requested-With') == 'XMLHttpRequest'"
)
我只使用 jQuery 作为 JS 框架,所以 XMLHttpRequest
不会有问题。 Ajax调用路由不执行会触发什么异常?我可以捕获它并向用户显示消息吗?或者显示某种 404 页面?
我发现了一个类似的问题here但我完全不清楚
您可以在 kernel.request 侦听器中这样做。
class DisallowNonXmlHttpRequestListener
{
public function checkRequest(GetResponseEvent $event)
{
if (!$event->getRequest()->isXmlHttpRequest()) {
throw new AccessDeniedHttpException();
}
}
}
并且在您的服务配置中:
services:
disallow_non_xml_http_request_listener:
class: DisallowNonXmlHttpRequestListener
tags: [{ name: kernel.event_listener, event: kernel.request, method: checkRequest }]
我正在寻找实现 "automatic" 对 Ajax 呼叫的路由限制的最佳方法。现在我正在做如下:
/**
* @Secure(roles="IS_AUTHENTICATED_FULLY")
* @Route("/someRoute", name="someRoute")
* @Method("POST")
*/
public function eliminarFacturasAction(Request $request)
{
$response['success'] = false;
$status = 400;
if ($request->isXmlHttpRequest()) {
// needs to set $response values and $status=200 all the time
} else {
// needs to handle the exception and return Json response
}
return new JsonResponse($response, $status ?: 200);
}
为了避免这种情况,我可以改用这个吗?
@Route("/someRoute",
name="routeName",
condition="request.headers.get('X-Requested-With') == 'XMLHttpRequest'"
)
我只使用 jQuery 作为 JS 框架,所以 XMLHttpRequest
不会有问题。 Ajax调用路由不执行会触发什么异常?我可以捕获它并向用户显示消息吗?或者显示某种 404 页面?
我发现了一个类似的问题here但我完全不清楚
您可以在 kernel.request 侦听器中这样做。
class DisallowNonXmlHttpRequestListener
{
public function checkRequest(GetResponseEvent $event)
{
if (!$event->getRequest()->isXmlHttpRequest()) {
throw new AccessDeniedHttpException();
}
}
}
并且在您的服务配置中:
services:
disallow_non_xml_http_request_listener:
class: DisallowNonXmlHttpRequestListener
tags: [{ name: kernel.event_listener, event: kernel.request, method: checkRequest }]