gwt grails кросс-запрос домена - PullRequest
0 голосов
/ 17 марта 2011

Интересно, как сделать междоменный запрос от приложения gwt к действию grails.Я знаю, что есть wgt-плагин для Grails, но разработка с этим плагином идет очень медленно (потому что мне приходится компилировать после каждого изменения в gwt-коде).Поэтому я пытаюсь разработать часть gwt отдельно и получить данные из приложения grais с помощью ajax-запроса.Но приложение gwt работает на другом сервере (gwt: порт 8888, garils: порт 8080).Если я пытаюсь запросить действие grails, в браузере появляется эта ошибка:

XMLHttpRequest cannot load http://localhost:8080/MyApp/MyDomain/myAction. 
Origin http://127.0.0.1:8888 is not allowed by Access-Control-Allow-Origin.

Я пытаюсь изменить заголовок ответа в действии grails:

response.setHeader('Access-Control-Allow-Origin', "http://127.0.0.1:8888");

И если я вызываюдействие из браузера в шапке я могу найти:

Access-Control-Allow-Origin:http://127.0.0.1:8888

Но это не решить проблему.Что я делаю не так?

Заранее спасибо,

Medrod

ОБНОВЛЕНИЕ:

Решение - JSONP.На GWT-сайте мой код выглядит так:

private void jsonp() {

JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
String URL = "http://localhost:8080/MyApp/myDomain/myAction";

jsonp.requestObject(URL, new AsyncCallback<JavaScriptObject>() {
    @Override
    public void onFailure(Throwable caught) {

    }
    @Override
    public void onSuccess(JavaScriptObject result) {

    }
});

}

А код grails выглядит так:

def myAction = {
    def results = MyDomain.findAll()
    render "${params.callback}(${results as JSON})"
}

Благодаря Mic.

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Веб-браузеры имеют встроенный механизм безопасности, называемый Same Origin Policy (SOP) , который мешает вам сделать это.

Вы можете использовать JSONP , который встраивает ваш ответ в функцию Javascript, которая будет вызываться, когда файл загружается и вставляется на вашу страницу как тег SCRIPT.

Например, ответом может быть что-то вроде:

myCallbackFunction('a string parameter', {or:{a:json:'data'}}, ...)

А у вас на странице есть функция:

myCallbackFunction(str, json, ...){...}
0 голосов
/ 26 января 2013

Чтобы решить эту проблему, просто назначьте переменную для вашей строки json в eval

private final native MyJson evalJson(String json) /*-{
  eval('var res = ' + json);
  return res;
}-*/;

Для получения дополнительной информации см. « Не удается загрузить XMLHttpRequest. Источник не разрешен Access-Control-Allow-Origin ».

...