跨域Ajax - 为什么xmlHttpRequest返回false?

时间:2015-11-19 09:09:45

标签: php jquery ajax symfony cross-domain

我正在做这样的Ajax请求:

    $.ajax({
        type: "POST",
        url: Routing.generate('check_login_ajax'),
        dataType: 'json',
        data: {
            _username: $('#_username').val(),
            _password: $('#_password').val(),
            _remember_me: false,
            _csrf_token: $('#_csrf_token').val()
        }
    }).done(function (data) {
        console.log(data);
    });

php控制器:

    public function CheckLoginAjaxAction() {
            $request = $this->get('request');

            $success = false;
            $responseCode = 300;
            if ($request->isMethod('POST') && $request->isXmlHttpRequest()) {
                    $responseCode = 200;
                    $success = true;
            }

            $return = json_encode(array('responseCode' => $responseCode, 'success' => $success));
    }

我有,在我的xbo.dev网站上:

Object {responseCode: 200, success: true}

我的子域名为blog.xbo.dev:

Object {responseCode: 300, success: false}

所以,我的请求有效,但它不被视为有效的POST xml请求。 为什么?

顺便说一句,我还有一个小问题。当我从子域发出Ajax请求时,它不会出现在Symfony2调试工具栏中。你知道如何更改它吗?是否可能?

Symfony2 debug toolbar

由于

1 个答案:

答案 0 :(得分:1)

我假设您正在为您的AJAX调用使用jQuery,在这种情况下,jQuery在检测到跨域请求时会尝试变聪明,并将请求的格式更改为JSONP。 JSONP实际上只是为请求的URL创建一个脚本标记并运行生成的脚本(有关Wikipedia的更多详细信息)。所以进入你的控制器的请求实际上是一个GET而不是一个POST(因为jQuery正在请求一个脚本),这也是它不会作为AJAX请求出现在Symfony工具栏中的原因。

要解决此问题,您应该查看Cross Origin Resource Sharing (CORS),这是专门解决这样的跨域AJAX请求。实现这一点的细节超出了本答案的范围,并取决于您的浏览器支持和JavaScript设置。