Ошибка «Отказано в доступе» при вызове междоменного домена AJAX с использованием XDomainRequest - PullRequest
1 голос
/ 17 ноября 2011

Я создал страницу php, которая использует API Google Javascript. Я пытаюсь использовать Ajax для динамического заполнения информационных окон маркеров, но получаю ошибку об отказе в разрешении в строке xdr.open. Я проверил другие сообщения, относящиеся к подобным ошибкам, и попробовал другие изменения, но все еще та же самая ошибка.

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0; padding: 0 }
#map_canvas { height: 100% }
</style>

<script type=text/javascript>
var marker;
var map;
var xdr;

function loader()
{
        alert("XDR onload");
        alert("Got: " + xdr.responseText);
}

function Info(pmarker)
{
    google.maps.event.addListener(pmarker, 'mouseover', function()
    {
     if (window.XDomainRequest)
     {
        xdr = new XDomainRequest();
        if(xdr)
        {
            document.write('1');

            xdr.open("GET", "http://localhost/GMap/GroovyCaller.php?Node=Host1");
            xdr.send();
            document.write('2');
            xdr.onload = loader;
        }

        else
        {
            document.write('3');
            alert('Failed to create');
        }
     }
     else
     {
          document.write('4');
          alert('XDR does not exist');
     }
});
}
function createMarker() {

    var myLatlng = new google.maps.LatLng(-34.397, 150.644);
    var marker = new google.maps.Marker({
        position: myLatlng,
        map: map,
        title:"Hello World!"
        });
        Info(marker);
}
function initialize()
{
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions =
    {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"),
    myOptions);


    createMarker();

}


</script>
</head>
<body onload="initialize()">
<div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>

Ответы [ 2 ]

2 голосов
/ 20 сентября 2012

У меня была проблема, похожая на эту, когда у меня был код на стороне клиента, работающий в локальном домене (например, www.domain.local), который пытался связаться с сервером на localhost.Даже когда я добавил Access-Control-Allow-Origin: * в заголовки ответа сервера, я все еще получал отказ в доступе.

Оказывается, XDomainRequest не нравится пытаться получить доступ к localhost из другого домена.См. Пункт 6 из http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx.

Мое решение состояло в том, чтобы создать еще один поддельный домен, указывающий на локальный хост, используя мой файл hosts, а затем вместо этого направив XDR на этот новый домен.

1 голос
/ 18 ноября 2011

GroovyCaller.php возвращает HTTP-заголовок Access-Control-Allow-Originhttp://msdn.microsoft.com/en-us/library/cc288060(v=vs.85).aspx:

Для междоменных запросов требуется взаимное согласие между документом и сервером.[...] Соединение будет установлено только в том случае, если сервер ответит заголовком Access-Control-Allow-Origin либо *, либо точным URL запрашивающего документа.

Ваш сервер должен знатьо вашем клиенте, чтобы принять кросс-доменное соединение.Вы можете начать с Access-Control-Allow-Origin: *, чтобы он заработал, а затем сузить его.

...