Использование JSONP для получения XML - PullRequest
2 голосов
/ 07 февраля 2012

За два дня я обошел множество форумов, но не нашел точного решения своей проблемы. У меня проблема межсайтового скриптинга . Веб-сервисы моего приложения, написанные с использованием javascript, html и css, получают сообщение об ошибке типа

"XMLHttpRequest не может загрузиться ... бла-бла-бла .. Начало http://localhost:8088 не разрешено заголовком ответа Access-Control-Allow-Origin." Код, который я пишу, является;

$.ajax({

async: false,
type: "GET",
url: "http://www.yem...om/Cata.../M...ogin2?username=blabla&password=blabla123",
dataType: "xml",
success: function(xml) {
    alert("CONTROL???");
    $(xml).find('Login').each(function(){
        var logResult = $(this).find('Result').text();
        alert(logResult);
        });


    }
  })

;

Я вижу, что должен использовать JSONP . Но когда я записываю dataType: "*jsonp xml*" или dataType: "*jsonp text xml*", я получаю сообщение об ошибке, например " SyntaxError: Parse Error "!

Также я попробовал CORS Filter , но для этого нужен web.xml, но у меня его нет. Когда я создал и попытался это сделать, я потерпел неудачу!

Более того, я пробовал междоменные запросы с помощью jQuery от Джеймса Падолси http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/ Это работает, но я не проанализировал полученные данные. Этот плагин использует Yahoo Query Language, поэтому управление данными отличается и не так просто.

Есть ли еще способ выяснить мою проблему? Пожалуйста, помогите мне!

С наилучшими пожеланиями.

Ответы [ 4 ]

0 голосов
/ 19 февраля 2015

Вы можете написать XML в функции Javascript внутри в /* comment */ и преобразовать эту функцию в текст с помощью метода functionname.toString () и разбирать текст между "/*" и "*/" с помощью Функция JSONP callback , которая работает во всех старых браузерах. Пример xml_via_jsonp.js :

function myfunc()
{/*
<xml>
<div class="container">
        <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel">
            <div class="panel-heading">Random1 - Random2</div>
            <div class="panel-body">
                <div>Random3</div>
            </div>
        </div>
    </div>
</xml>
*/}

function callback(func)
{
var myhtml = func.toString();
var htmlstart = myhtml.indexOf('/*');
var htmlend = myhtml.lastIndexOf('*/');
return myhtml.substr(htmlstart+2, htmlend-htmlstart-2);
}
0 голосов
/ 07 февраля 2012

Чтобы получить результаты в JSONP, добавьте это в конец URL-адреса: & callback =?

Попробуйте:

$.getJSON('http://www.yem...om/Cata.../M...ogin2?username=blabla&password=blabla123&callback=?', function(xml) {
    alert("CONTROL???");
    $(xml).find('Login').each(function(){
        var logResult = $(this).find('Result').text();
        alert(logResult);
    });
});

Также необходимо включить междоменный сценарий на стороне сервера..

0 голосов
/ 29 августа 2014

Я застрял с аналогичной проблемой.Я нашел, что решение этого вопроса исправило мою проблему с XSS: Ошибка «Нет транспорта» с вызовом jQuery ajax в IE

Вам не нужно использовать JSONP, поскольку CORS работает с XMLответ.Вы пытались установить для свойства support.cors значение true (решение по вышеуказанному вопросу)?

$.support.cors = true;

0 голосов
/ 07 февраля 2012

Междоменные ограничения существуют по причине. Он защищает интернет-пользователей. Это сделано для того, чтобы программисты и хакеры не делали много вредных вещей.

Есть некоторые вещи, которые вы можете сделать, чтобы обойти это. Одним из них является то, что вы можете использовать CORS Filter для разрешения запросов из разных доменов. Вы говорите, что у вас нет файла web.xml. Я не уверен, как выглядит ваш проект, но если вы используете веб-сервисы, то где-то должен быть какой-то файл web.xml. Если вы не можете настроить это, вам не повезло (если не использовать хороший прокси, такой как YQL или что-то подобное). Такие вещи, как YQL, они настроили свой фильтр CORS, чтобы разрешить запросы со всех доменов. Вызов YQL - это вызов ajax, как и вызов ajax, который вы пытаетесь сделать. Большая разница в том, что на YQL-сервере есть настройка фильтра CORS, которую браузер обнаруживает и разрешает выполнение междоменного запроса.

Как только фильтр CORS будет установлен, браузер позволит вам подключиться к этому домену из другого домена. Вместо того, чтобы искать способ его взломать, вам нужно настроить свой проект так, чтобы он разрешал перекрестные запросы.

Если вы не контролируете веб-сервисы, которые вы пытаетесь пропинговать, вам не повезло. Только владелец веб-сервисов будет иметь доступ к web.xml.

...