GWT 请求生成器问题(相同的站点策略问题?)

Posted

技术标签:

【中文标题】GWT 请求生成器问题(相同的站点策略问题?)【英文标题】:GWT Request Builder problem (same site policy issue?) 【发布时间】:2011-01-24 07:16:43 【问题描述】:

我正在这个“配置”中试用 GWT:

1) 我在 python 中编写了一个服务器后端,它将产生 json 输出(在 localhot:8094 运行)

2) 我编写了一个非常简单的 GWT 应用程序,它将使用 RequestBuilder 将 GET 设置到 python 服务器(在 GWT eclipse 插件的开发模式下,它可以通过http://127.0.0.1:8888/test.html 访问)

代码很简单

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Test implements EntryPoint 
    /**
     * The message displayed to the user when the server cannot be reached or
     * returns an error.
     */

    private static final String SERVER_URL = "http://localhost:8094";
    private static final String SERVER_ERROR = "An error occurred while "
            + "attempting to contact the server. Please check your network "
            + "connection and try again.";

    /**
     * This is the entry point method.
     */
    public void onModuleLoad() 

        RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, SERVER_URL);
        try 
            requestBuilder.sendRequest(null, new Jazz10RequestCallback());
         catch (RequestException e) 
            Window.alert("Failed to send the message: " 
                    + e.getMessage());
        

    

    class Jazz10RequestCallback implements RequestCallback

        public void onError(Request request, Throwable exception) 
                // never reach here
        Window.alert("Failed to send the message: "
                    + exception.getMessage());

        

        public void onResponseReceived(Request request, Response response) 
            // render output
            Window.alert(response.getText());

        


    

但是警报总是来自 onResponseReceived 并且什么都不显示(我想是空字符串)

我可以访问我的 python 服务器并通过浏览器下载 json。但是我看不到任何来自 GWT 的请求到达服务器。

我已确保“inherits name='com.google.gwt.http.HTTP”在 gwt.xml 文件中

问题是:

1) 这里的网站政策限制是否相同?我希望出现异常(因此会出现失败消息),但它没有发生

2) 如果确实是同一个站点策略问题,那么从 python 后端部署 GWT 脚本的最简单方法是什么? eclipse gwt 插件在 war 子目录中产生了一些工件。将这些文件复制到我的 python 后端的某个静态目录就足够了吗?

【问题讨论】:

【参考方案1】:

1) 是的,虽然主机相同,但您尝试访问不同的端口 - SOP 不允许这样做。您可能会遇到 javascript 异常 - 检查 Firebug 的控制台或类似的东西。

2) 关注官方文档中的guide。您不需要 Java 服务器 - 只需一个可以提供 HTTP 内容的服务器(例如,Apache 就可以了)。我没有使用 Python 作为后端的经验,但我确信有一个提供 Python 和 HTTP 服务的解决方案。

使用 -noserver 标志时,您的 GWT 使用外部服务器 托管模式浏览器同时提供 您的动态内容和所有静态内容 内容(例如 GWT 应用程序的 主机页面、其他 HTML 文件、图像、 CSS 等等。)

在这种情况下,动态内容将是您的 Python 脚本。

【讨论】:

【参考方案2】:

是的,由于 SOP,这将失败。你得到什么 HTTP 响应代码?通常在这种情况下返回为 0 而不是 200 (OK)。一个解决方案可能是使用 JSONP 方法,我在本文中写了一些关于 JSONP 和 GWT 的文章:http://www.bristol-gtug.org/?p=76

【讨论】:

没有弹簧怎么办?【参考方案3】:

这可能为时已晚。如果您没有使用相对路径等访问本地资源,那么您是对的,它受制于 SOP(同源策略)。 -no-server 标志对解决此问题没有多大帮助。要绕过此问题,请阅读 http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_JSONFeedsFromOtherDomain 。更好的解决方案是使用 gdata api 使用的 com.google.gwt.jsonp.client.JsonpRequestBuilder,(请记住继承继承名称 = 'com.google.gwt.jsonp.Jsonp' \)(“更好“在某种意义上说你不必自己写)。希望这可以帮助。干杯~

【讨论】:

以上是关于GWT 请求生成器问题(相同的站点策略问题?)的主要内容,如果未能解决你的问题,请参考以下文章

GWT 异步生成,在某些情况下关闭?

登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)

如何将类型添加到 GWT 的序列化策略白名单?

GWT 客户端 RPC 请求序列化

从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件

GWT 和 XSRF 保护