Отсутствует X-Requested-With: XMLHttpRequest (вызывает 200 ОК, но отображается как ошибка?) - PullRequest
1 голос
/ 20 октября 2011

Когда я получаю данные с моего локального хоста как JSON, все в порядке.Когда я пытаюсь получить эти данные JSON с удаленной машины, все в порядке.Я могу разобрать, что данные JSON поступают с моего локального хоста в объекты (плагин datagrid: jqgrid отображает его).Однако, когда я пытаюсь использовать удаленный источник, это не так.В firebug он говорит 200 OK, но показывает значок ошибки и пишет его красным.Я проверил различия между заголовками локального и удаленного подключения и обнаружил, что при удаленном подключении этого заголовка нет:

X-Requested-With    XMLHttpRequest

Я думаю, что проблема может быть в этом.Я не устанавливал это, и это работало хорошо.Это происходит при удаленном запросе.

Есть идеи, чтобы решить это?

PS: Я пытался установить заголовки Ajax, но не работал:

    $.ajaxSetup({
          headers: {"X-Requested-With":"XMLHttpRequest"}
    });

    $("#userTable").jqGrid({
        url:'http://xx.xx.x.xxx:8080/aa/bb/cc/user',
        colNames:['User Name','Password'],
        colModel:[
            {name:'userName',index:'userName', width:100},
            {name:'password',index:'password', width:55}
        ],
        jsonReader: ...
        ...
    });

Когда я использую эту настройку, я даже не вижу GET-запрос от Firebug.

PS: Я использую Spring 3 с REST и Tomcat в качестве веб-сервера.

1 Ответ

1 голос
/ 20 октября 2011

Я думаю, что у вас есть проблема Межсайтовый скриптинг . Проблема может быть решена, если сервер установит некоторые дополнительные опции в заголовке HTTP ответа. Таким образом, решение заключается не в модификации клиентского кода, как вы делаете сейчас, а в коде сервера.

Я рекомендую вам изучить параметры HTTP, которые будут установлены в заголовке HTTP с помощью tables.googlelabs.com, используемого в демоверсии из ответа . Вы увидите, что ответ сервера имеет следующие дополнительные параметры HTTP:

X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block

и ответ JSON будет помещен в вызов функции, определенной параметром jsonCallback. Если вы используете jsonCallback=?, jqGrid сгенерирует имя функции (что-то вроде jQuery16407707202236448429_1319101394784). Вы можете узнать больше о X-XSS-Protection option здесь и о X-Content-Type-Options: nosniff option здесь .

Как вы можете видеть в демонстрации , данные будут отображаться в jqGrid, поэтому межсайтовый скриптинг может быть реализован в jqGrid.

Поскольку мы называем сервер tables.googlelabs.com, который не поддерживает параметры подкачки и сортировки jqGrid, я использовал его в демонстрационной версии

url: 'http://tables.googlelabs.com/api/query?jsonCallback=?',
postData: "sql=" + encodeURIComponent("SELECT * FROM 333136 LIMIT 10")

Использование строки вместо объекта в качестве значения postData будет перезаписывать любых других параметров jqGrid, которые обычно публикуются. В этом случае вам это не понадобится, и, вероятно, вам нужно просто использовать url: 'http://xx.xx.x.xxx:8080/aa/bb/cc/user?jsonCallback=?'.

В любом случае вам необходимо реализовать поддержку JSONP на вашем сервере. Это просто означает, что сервер должен «понимать» параметр jsonCallback. Реализация зависит от вашей реализации на стороне сервера. Это может быть просто crossDomainScriptAccessEnabled="true" параметр привязки для webHttpBinding в случае службы WCF (см. здесь пример web.config). См. этот ответ и этот (или этот ) дополнительно для веб-служб ASP.NET и ASP.NET MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...