Как можно избежать ошибки политики кросс-источника при попытке доступа к localhost? - PullRequest
4 голосов
/ 12 декабря 2011

Я хочу загрузить статический веб-сайт на внешний сервер, который будет пытаться получить данные JSON из localhost:3000 (на компьютере пользователя уже будет запущена серверная программа).

Я пытаюсь сделать это с помощью jQuery следующим образом:

$.getJSON("http://localhost:3000/page", function(data){
    // process data...
});

Почему я получаю ошибки политики разных источников и как их можно устранить? Я думал, что доступ к данным JSON должен был свести на нет эти межсайтовые ошибки?

ОБНОВЛЕНИЕ 1

Я только что попробовал JSONP с обратным вызовом, как предложено, но вот странная проблема: если я добавлю тег сценария, который указывает на URL localhost:3000/page, обратный вызов загружается, и данные отображаются правильно, когда страница загружена , но это не то, к чему я стремлюсь.

Если я попробую то же самое, используя метод $.getJSON, я получу ту же ошибку, что и раньше:

XMLHttpRequest cannot load http://localhost:3000/page. Origin http://localhost is not allowed by Access-Control-Allow-Origin..

1 Ответ

3 голосов
/ 12 декабря 2011

Интересная идея!

Но localhost - это совершенно другой домен, чем somewebsite.com. Таким образом, применяется та же политика происхождения. Вам нужно либо:

  • JSONP Это означает, что сервер на localhost должен поддерживать упаковку JSON в пользовательский обратный вызов
  • CORS , который допускает настоящий междоменный ajax, но требуется много дополнительных фаззинга заголовка на обоих концах запроса.

JSONP, вероятно, проще всего осуществить. Из документов на $.getJSON():

Если URL содержит строку "callback =?" (или аналогичный, как определено серверный API), запрос обрабатывается как JSONP. Увидеть обсуждение типа данных jsonp в $ .ajax () для более подробной информации.

Тогда вашему localhost серверу просто нужно использовать тот параметр обратного вызова, который будет передавать jQuery. Это означает, что вместо простого рендеринга этого:

<%= jsonString() %>

Локальный сервер должен отобразить что-то вроде этого:

<% if (params.callback) { %>
  <%= params.callback %>(<%= jsonString %>);
<% } else { %>
  <%= jsonString %>
<% } %>
...