我想知道如何从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。
答案 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”。