AJAX обмен данных с одного домена на другой

12
G
На сайте с 19.07.2009
Offline
39
4325

Здравствуйте.

Прошу помощи.

Есть index.php

<script type="text/javascript" >


var req = Create();
// создаем соединение ajax
function Create(){
if(navigator.appName == "Microsoft Internet Explorer"){
req = new ActiveXObject("Microsoft.XMLHTTP");
}else{
req = new XMLHttpRequest();
}
return req;
}


function ge(id) { return document.getElementById(id);}

function Opublikovat()
{

var Opublikovat ='value=1';
RequestOpublikovat(Opublikovat);
}

function RequestOpublikovat(Opublikovat)
{
req.open('post', 'AJAX.php' , true ); //Сначала определяем метод отправки данных. Дальше адрес приемника, то есть скрипта, которому запрос адресован. Это тоже самое, что action в форме.Следом - true. Это команда продолжать скрипт вне зависимости от того, отправлен запрос или нет.
req.onreadystatechange = RefreshOpublikovat;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
req.send(Opublikovat);
}

function RefreshOpublikovat()
{
if( req.readyState == 4 )
{ge('Opublikovat').innerHTML = req.responseText; }
}

alert ("script работает");
</script>

<input type="button" value="Опубликовать" id="button" onClick="Opublikovat();"/>
<div id ="Opublikovat"></div>

и AJAX.php

<? echo $_POST['value']; ?>

Всё это работает на одном домене, но мне надо чтобы AJAX.php лежал на другом домене.

Я много читал про политику безопасности и читал про способы как это обойти, но не нашел ни одного внятного примера как это реализовать.

Поэтому прошу решить проблему с кроссдоменностью AJAX на конкретном примере приведенном выше.

MirUrokov.ru - ГДЗ (готовые домашние задания), видео уроки, открытые уроки, онлайн калькуляторы. (http://mirurokov.ru)
ДП
На сайте с 23.11.2009
Offline
203
#1

гуглите на тему JSONP - это кросдоменный ajax. Можно еще через прокладку в виде флешки, как минимум.

babnicks
На сайте с 23.10.2009
Offline
47
#2
gooooodru:
Здравствуйте.
Всё это работает на одном домене, но мне надо чтобы AJAX.php лежал на другом домене.
Я много читал про политику безопасности и читал про способы как это обойти, но не нашел ни одного внятного примера как это реализовать.
Поэтому прошу решить проблему с кроссдоменностью AJAX на конкретном примере приведенном выше.

Пост-запросы AJAX в связи с безопасностью по-определению работают только на вызываемом домене (если браузер не глючит).

Если Вы хотите делать какие-то запросы на другой сервер, то Вам необходима какая-то прослойка. Или прокси на стороне сервера, с которого грузится JS код или на клиенте в виде Flash'ки.

При этом, если Вы хотите чтобы это была flash на клиенте, то на домене, на который вы делаете post из flash в корне должен лежать файл crossdomain.xml

вот такого вида:


<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*.domain1.ru" />
</cross-domain-policy>

Где domain1.ru - это домен, с которого была загружена flash (если он отличается от того, куда вы хотите постить)

Все это сделано ради безопасности посетителя и веб-сервера, куда Вы собираетесь отправить post-запрос.

Ну если все-таки хочется отправлять посты, то создаем фрейм (0x0px), в нем рисуем форму (как угодно, через document.write или через document.createElement), в форме делаем method="post" и action = "http://www.domain2.ru/желаемый_скрипт", создаем какие надо поля внутри формы и вызываем submit() у созданной формы.

Все легко и просто :) если на сайте не стоит csrf защита ;)

100% защита от спам-ботов (https://www.keycaptcha.com)
ДП
На сайте с 23.11.2009
Offline
203
#3

C формой с action на другой домен неудобство в том, что чаще всего надо еще прочитать данные, которые скрипт на другом домене вернул. А в этом случае это затруднительно.

babnicks
На сайте с 23.10.2009
Offline
47
#4
Дикий пионер:
C формой с action на другой домен неудобство в том, что чаще всего надо еще прочитать данные, которые скрипт на другом домене вернул. А в этом случае это затруднительно.

Если домен (и сайт на который Вы собрались постить) Ваш, то ничего затруднительного нет, делайте call-back функцию в родительском фрейме и вызываете ее как ответ с нужными параметрами. Ну или вообще просто возвращаете html с js-кодом, который делает все что угодно.

Если-же домен не ваш, то это называете CSRF атака и особо выбирать между способами тут не приходится ;) Иных способов кроме формы с method=POST просто не существует.

G
На сайте с 19.07.2009
Offline
39
#5

Есть мой сайт на котором должен лежать AJAX.php и выполнять определенные действия в зависимости от того что пришлет JS (который расположен на любом домене, даже на UCOZ и народ).

Сейчас как и посоветовали копаю в сторону JSONP и читаю www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/

gooooodru добавил 10-10-2011 в 17:52

Ни как не могу найти четкий пример:

это сервер здесь лежит файл XXX.php - в нем написано то-то: .......

это клиент, у него JS скрипт в котором написано то-то.....

Хотя бы обычный банальный пример... но нет

Все вокруг да около

babnicks
На сайте с 23.10.2009
Offline
47
#6
gooooodru:
Сейчас как и посоветовали копаю в сторону JSONP и читаю www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/

А у Вас задача "отправить пост-запрос на другой домен", читайте пост выше.

ДП
На сайте с 23.11.2009
Offline
203
#7

Кстати, да, ТС - вам критично, чтобы данные через POST приходили? Скрипты, которые вам будут данные посылать рассчитывают на какой-то ответ от вашего скрипта или нет?

babnicks
На сайте с 23.10.2009
Offline
47
#8
gooooodru:
Сейчас как и посоветовали копаю в сторону JSONP и читаю www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/

JSNOP никак не позволяет отправлять POST-запросы.

G
На сайте с 19.07.2009
Offline
39
#9

Чтобы все было ясно объясню реальную задачу:

есть сайт mirurokov.ru на нем есть база с гдз http://mirurokov.ru/gdz-onlain.html

Хочу сделать так чтобы у клиента был небольшой JS код (который бы работал и на UCOZ и на народе), который бы выводил выпадающий список на AJAX.

Так вот там уже есть js код-попытка это реализовать, но проблема в том что это не работает в IE (очень хороший и нужный браузер)

В принципе все равно будут GET или POST запросы главное чтобы работало во всех браузерах и на всех хостах ( UCOZ, народ)

babnicks
На сайте с 23.10.2009
Offline
47
#10
gooooodru:
Чтобы все было ясно объясню реальную задачу:
есть сайт mirurokov.ru на нем есть база с гдз http://mirurokov.ru/gdz-onlain.html
Хочу сделать так чтобы у клиента был небольшой JS код (который бы работал и на UCOZ и на народе), который бы выводил выпадающий список на AJAX.
Так вот там уже есть js код-попытка это реализовать, но проблема в том что это не работает в IE (очень хороший и нужный браузер)
В принципе все равно будут GET или POST запросы главное чтобы работало во всех браузерах и на всех хостах ( UCOZ, народ)

Данная задача решается с помощью приведенной вами ссылке про JSNOP. Но изначально Вы говорили про POST запросы, а это соовсем другая история ;)

Суть же ее решения (вашей задачи) простым языком (без использования каких-либо бибилиотек):

1. На своем сайте http://mirurokov.ru создаете скрипт, который будет возвращать JS-код с нужными Вам данными в виде, словаря, массива или чего еще хочется. В конце делаете вызов какой-нибудь JS-функции из основной страницы, которая переработает данные из массива в Ваш список выбора.

2. На странице в которую хотите вставить выпадающий список пишите обработчики на контроли выбора, в котором динамически создаете с помощью document.createElement объект типа script и прописываете ему setAttribute( "type", "text/javascript") и setAttribute( "src", "http://mirurokov.ru/ваш_скрипт.php?параметр1=1&параметр2=2&r="+Math.random() )

3. Получаете удовольствие :)

Увидев setAttribute( "src", "http://mirurokov.ru/ваш_скрипт.php?параметр1=1&параметр2=2&r="+Math.random() ) браузер сделает запрос к этому УРЛу, в параметрах к которому Вы передали нужные Вам для построения выдачи данные. ( &r="+Math.random() добавлять обязательно, так как это GET запрос и может иначе закэшироваться )

Результатом будет выполнение отданного данным урлом (http://mirurokov.ru/ваш_скрипт.php) JS кода, в котором Вы можете написать Все что хотите.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий