Symfony 2.3。,如何限制ajax调用的路由

时间:2015-06-08 07:04:22

标签: php ajax symfony-2.3

我是Symfony 2的新手。我正在使用Symfony 2.3。

我正在为我的路线使用yml文件。我希望某个路由仅限于Ajax调用。我怎样才能做到这一点?我找到了一个类似的question,但它建议的解决方案是针对Symfony 2.4

所以请帮助我如何实现它。

目前我已经在我的控制器ajax动作中编写了条件代码,如下所示,但我不知道如果对该路由的调用不是通过Ajax,如何处理。

if ($request->isXmlHttpRequest()) {
   // Some operations    
   // Prepare the data array based on the Ajax request.
}

return $this->render('AcmeBundle:Ajax:index.html.twig', array('data' =>  $data));

我希望只能使用Ajax访问此路由,否则它应该抛出一些异常,例如无效路由或重定向到其他页面。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我在symfony 2.3中不知道这种方式,但在版本2.4中,以下路由配置可用于识别ajax请求。

ajax_route:
    path:     /your-ajax-route
    defaults: { _controller: AcmeBundle:Ajax:index }
    condition: "request.isXmlHttpRequest()"

路由的注释版本也可以像下面这样使用:

/**
 * IndexAction
 *
 * @Route("/your-ajax-route/", name="ajax_route", condition="request.isXmlHttpRequest()")
 */

以上所有内容只是了解ajax请求的临时解决方案,否则可以操纵标头,并且您永远无法识别请求是否为xmlhttp。没有100%可靠的方法来检查xml http请求。

答案 1 :(得分:1)

首先,可以操纵标题。所以带有一堆标题的curl请求可以提取ajax请求。我相信你可以用Symfony 2.3检查标题

use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
$ajax = $request->headers->get('HTTP_X_REQUESTED_WITH');
if($ajax != 'xmlhttprequest'){
 throw new \Exception("This is not an ajax request");
}

或者您可以使用$_SERVER['HTTP_X_REQUESTED_WITH'] == "xmlhttprequest"