gwt grails跨域请求

时间:2011-03-17 14:13:54

标签: javascript gwt grails cross-domain

我想知道如何从gwt应用程序向grails操作发出跨域请求。我知道有一个用于grails的wgt-plugin但是这个插件的开发速度很慢(因为我必须在gwt-code中的每次更改后编译)。所以我尝试单独开发gwt部分并通过ajax请求从grais应用程序获取数据。但是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-Site上,我的代码如下所示:

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 个答案:

答案 0 :(得分:1)

Web浏览器有一个名为Same Origin Policy (SOP)的内置安全机制,阻止您这样做。

您可以使用JSONP,它将您的响应嵌入到Javascript函数中,该函数将在文件加载并在您的页面中作为SCRIPT标记注入时调用。

例如,响应可能类似于:

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

在您的页面中,您有一个功能:

myCallbackFunction(str, json, ...){...}

答案 1 :(得分:0)

要解决此问题,只需将json字符串中的变量分配到eval

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

有关详细信息,请参阅“XMLHttpRequest cannot load. Origin is not allowed by Access-Control-Allow-Origin”。