2011-01-23 7 views
2

Я пытаюсь сделать ajax-вызов внешнего домена, который уже разрешает внешние запросы, отправив Access-Control-Allow-Origin:* заголовок, но я получил разрешение на отказ в строке xmlhttp.post().Разрешение AJAX отрицается в IE?

Вот мой код:

var xmlhttp; 
try { 
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
} catch (e) { 
    try { 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } catch (E) { 
     xmlhttp = false; 
    } 
} 

if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { 
    try { 
     xmlhttp = new XMLHttpRequest(); 
    } catch (e) { 
     xmlhttp = false; 
    } 
} 

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     alert(xmlhttp.responseText); 
    } 
} 

xmlhttp.open("GET", "http://www.domain.com", true); 
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
xmlhttp.send(); 
+0

Какая версия IE? – ceejayoz

+0

Я тестировал его на IE 8 – Ryan

ответ

1

Я считаю, что в IE вы все еще не можете использовать XMLHttpRequest для перекрестных доменных запросов. Для этого вам необходимо использовать объект XDomainRequest. Полная документация: here. Я считаю, что причина введения отдельного объекта заключалась в том, чтобы позволить разработчикам выполнить проверку совместимости перед тем, как сделать запрос, который наверняка потерпит неудачу с более старыми браузерами.

+0

Привет, Андрей, я использовал XDomainRequest, и он работает, но теперь он дает мне setRequestHeader не поддерживается – Ryan

+0

Ah. Да. Этот метод не поддерживается. Мне никогда не приходилось устанавливать этот заголовок раньше. Если вы хотите, чтобы представление отображалось в виде отправки формы, а не в виде строки запроса, измените свой '' GET '' на '' POST''. – Andrew

+0

Я действительно отправляю переменную json в POST, но сервер никогда не получает ее без установки этого заголовка. – Ryan

0

Я считаю, что вы можете использовать только Ajax с формой URL в том же домене, на странице вызова. Это не внешний домен, который запрещает запрос, это безопасность вашего браузера. Взгляните на Same Origin Policy Это способ избежать скриптов с кросс-браузерами - иначе вы представляете себе страницу, на которой вы можете ввести информацию о своей кредитной карте, а кто-то вводит скрипт, который отправляет информацию, которую вы вводите на внешний сайт. Было бы большой проблемой для борьбы.

+0

Заголовок «Access-Control-Allow-Origin: *» в верхней части вопроса должен позволять браузерам получать доступ к содержимому через домены (в тех браузерах, которые его распознают). IE8 должен, но я не думаю, что IE7. FireFox добавила поддержку вокруг версии 3.5, поэтому охват далеко не завершен. – Andrew

0

Примечание: Не используйте «http://domain.xxx» или «http://localhost/» или «IP» для URL-адреса в Ajax. Используйте только путь (каталог) и имя страницы без адреса.

ложное состояние:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST', 'http://www.example.com/dir1/dir2/page.php', true); 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 

истинное состояние:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST','dir1/dir2/page.php', true); // <<--- note 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 

function createAjax() 
{ 
    var ajaxHttp = null; 
    try 
    { 
     if(typeof ActiveXObject == 'function') 
      ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     else 
     if(window.XMLHttpRequest) 
      ajaxHttp = new XMLHttpRequest(); 
    } 
    catch(e) 
    { 
     alert(e.message); 
     return null; 
    } 
    //------------- 
    return ajaxHttp; 
}; 
Смежные вопросы