Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Cross Domain XmlHttpRequest
Просмотров: 450
 
Ответов: 8
Добрый день, друзья.
Целый день сегодня мучаюсь с вышеозначенной темой. Изначальная задача:
Выполняясь на site.com отправить POST запрос (даже ответ не обязательно получать) на xxx.site.com. В крайнем случае готов ограничиться браузером Google Chrome.
Казалось бы, задача уже не нова, написана куча материалов на тему, но что-то ничего не срабатывает…
Итак, что я уже попробовал:
- подменить document.domain перед отправкой. Как оказалось, менять с xxx.site.com на site.com можно, а вот обратно — никак...
- создать iframe с src=«xxx.site.com», а затем внутри него добавить в дом модель тег script, который будет содержать в себе логику по отправлению XmlHttpRequest. И вот этот вариант уже почти-почти сработал, как по непонятным мне причинам xhr.readystatechange вызывается один раз и readyState=1… Код примерно такой:
var iframe = $('<iframe src=«xxx.site.com» style=«display:none;»></iframe>').appendTo(document.body);
var iDoc = iframe.get(0).contentDocument;
var script = iDoc.createElement(«script»);
script.setAttribute(«type», «text/javascript»);
script.innerHTML =
«function postIt() {» +
«var xhr = new XMLHttpRequest();» +
«xhr.onreadystatechange = function(data) {» +
«alert(xhr.readyState);» +
«if (xhr.readyState == 4) {» +
" if (xhr.status == 200) {" +
" alert(data.toString());" +
" } else {" +
" alert(xhr.error);" +
" }" +
"}};" +
«var url = \»xxx.site.com\";" +
«var postParams = \»a=1&b=1\"" +
«xhr.open(\»POST\", url, true);" +
«xhr.setRequestHeader(\»Content-Type\", \«application/x-www-form-urlencoded;\»);" +
«xhr.send(postParams);» +
"}" +
«postIt();»;
iDoc.body.appendChild(script);
* This source code was highlighted with Source Code Highlighter.
- Также рассмотрел способ с YQL — не подошло
Какие есть еще идеи как это побороть?
var iframe = $('<iframe src=«xxx.site.com» style=«display:none;»></iframe>').appendTo(document.body);
var iDoc = iframe.get(0).contentDocument;
var script = iDoc.createElement(«script»);
script.setAttribute(«type», «text/javascript»);
script.innerHTML =
«function postIt() {» +
«var xhr = new XMLHttpRequest();» +
«xhr.onreadystatechange = function(data) {» +
«alert(xhr.readyState);» +
«if (xhr.readyState == 4) {» +
" if (xhr.status == 200) {" +
" alert(data.toString());" +
" } else {" +
" alert(xhr.error);" +
" }" +
"}};" +
«var url = \»xxx.site.com\";" +
«var postParams = \»a=1&b=1\"" +
«xhr.open(\»POST\", url, true);" +
«xhr.setRequestHeader(\»Content-Type\", \«application/x-www-form-urlencoded;\»);" +
«xhr.send(postParams);» +
"}" +
«postIt();»;
iDoc.body.appendChild(script);
* This source code was highlighted with Source Code Highlighter.
В чужой iframe писать js никто не даст по политике безопасности.
Для решения проблемы могу посоветовать переделать серверную логику xxx.site.com, чтобы воспринимался GET равно как POST, и использовать JSONP.
Вариант второй можно использовать, если логику xxx.site.com не поправить: сделать у себя на хосте ресурс, на который отправлять POST, и делать HTTP запрос с сервера site.com на сервер xxx.site.com.
Можно ещё попробовать сделать скрытый form, поставить у него action в «xxx.site.com», добавить input'ов с нужными name и value, и выстрелить form submit. Не уверен, что это будет работать везде.
Сам этим не занимался, но на hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ все прекрасно работает (смотрю в Firefox'e 4 beta 12, Chrom'а под рукой не наблюдается). Там есть примеры, которые можно «пощупать». + сатья ( developer.mozilla.org/en/HTTP_access_control ) на MDN (MDC), которая должна помощь в решении вопроса.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться