【问题标题】:XMLHttpRequest cannot loadXMLHttpRequest 无法加载
【发布时间】:2011-09-28 20:40:06
【问题描述】:

我正在尝试使用 AJAX 从多个服务器访问资源,但我遇到了这个问题:

XMLHttpRequest cannot load http://first.mydomain.com. Origin http://second.mydomain.com is not allowed by Access-Control-Allow-Origin.

使用以下代码

    for ( i in domains )
    {
        var url = 'http://'+domains[i]+'/mgmt/json/queue_status.php';
        requests[i]=new request(url);
        break;
    }

    function request(url)
    {
        var queues = {};
        http_request = new XMLHttpRequest();
        http_request.open("GET", url, true, 'username', 'password');
        http_request.onreadystatechange = function () {
            var done = 4, ok = 200;
            if (http_request.readyState == done && http_request.status == ok) {
                queues = JSON.parse(http_request.responseText);
                var queuesDiv = document.getElementById('queues');
                print_queues(queues, queuesDiv);                
            }
        }
        http_request.send(null);
    }

我已将以下内容添加到请求的响应页面中。

header('Access-Control-Allow-Origin: *');

我也尝试过明确命名请求者,但没有成功。

谢谢

PS:我确信上面的代码并不完美,但仅在尝试请求主机服务器的资源时运行良好。

【问题讨论】:

  • 经典。这是因为Same Origin Policy
  • 好的,但是有没有办法解决这个问题?
  • 是的,通过 JSONP 回调和<script> 标签注入。
  • 好的,据我所知,JSONP 允许您通过让浏览器从远程资源 onload 获取 JSON 来避免制作 XHR,但我怎样才能让它在没有只是粗暴地重新加载页面。

标签: php javascript apache xmlhttprequest cross-site


【解决方案1】:

跨域请求中不允许使用用户名和密码。

如果用户或密码作为参数传递并且 url 的来源与 XMLHttpRequest 的来源不匹配,则引发 INVALID_ACCESS_ERR 异常。

来源:http://www.w3.org/TR/XMLHttpRequest2/#the-open-method

只需将密码和用户名作为 get 变量传递即可。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 2023-04-10
    • 1970-01-01
    • 2014-06-23
    • 2018-02-02
    相关资源
    最近更新 更多