2011-03-17 123 views
0

我想知道如何從gwt應用程序向grails動作發出跨域請求。我知道grails有一個wgt-plugin,但是這個插件的開發非常慢(因爲我必須在gwt-code每次更改後編譯)。所以我嘗試分別開發gwt部分,並通過ajax請求從grais應用程序獲取數據。但gwt應用程序運行在不同的服務器上(gwt:port 8888,garils:port 8080)。如果我嘗試請求Grails的動作我得到這個錯誤在瀏覽器:gwt 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

UPDATE:

的解決方案是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})" 
} 

由於麥克風。

回答

1

Web瀏覽器內置一個名爲Same Origin Policy (SOP)的安全機制,可以防止您這樣做。

您可以使用JSONP,它將您的響應嵌入到Javascript函數中,該函數將在文件加載並作爲SCRIPT標記注入頁面時調用。

例如一個反應可能是這樣的:

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

而在你的頁面你有一個函數:

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