反向代理对GWT应用程序有什么影响?

反向代理对GWT应用程序有什么影响?,gwt,gwt-rpc,reverse-proxy,Gwt,Gwt Rpc,Reverse Proxy,我正在Glassfish 3.0.1上部署GWT2.4应用程序。我可以通过轻松访问我的应用程序,但是,当我使用Apache反向代理应用程序时,我得到一个异常,摘录如下(来自Glassfish日志): 分派传入RPC调用时发生异常 com.google.gwt.user.client.rpc.SerializationException: 类型“com.ozdokmeci.basicgwtproject.shared.GroupData”无法分配给“com.google.gwt.user.clie

我正在Glassfish 3.0.1上部署GWT2.4应用程序。我可以通过
轻松访问我的应用程序,但是,当我使用Apache反向代理应用程序时,我得到一个异常,摘录如下(来自Glassfish日志):

分派传入RPC调用时发生异常 com.google.gwt.user.client.rpc.SerializationException: 类型“com.ozdokmeci.basicgwtproject.shared.GroupData”无法分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。 出于安全目的,不会序列化此类型

实现
IsSerializable
解决了中建议的问题。 在相关问题上还有其他变通办法

我的问题是,这其中的根本原因是什么?两个看似不相关的解决方案(实现标记接口和扩展servlet类)是如何解决这个问题的?另外,本手册中提到的两种方法是否都有缺点

注意:如果直接访问应用程序,则不会发生异常。


注2:与异常相关的类已实现可序列化接口,就GWT而言,这应该相当于IsSerializable。

我有完全相同的问题,当我跟踪源代码时,我发现在反向代理时找不到GWT序列化文件的目录(我认为是因为该目录是一个相对路径)。这就是为什么即使您实现了IsSerializable,也会出现序列化异常

我最终的解决方案是为我的RPC使用RESTfulJSON。使用JSON将允许您反向代理,因为它不需要查找这些序列化文件

编辑

如果您仍然想使用GWT RPC,我有一个想法,知道它是如何实现的(尽管我自己还没有实现它)

首先,查看有关这些rpc文件的GWT帮助:

你会注意到上面写着:

RPC RemoteServiceServlet必须可以通过ServletContext.getResource()调用访问序列化策略文件

因此,您需要覆盖RemoteServiceServlet并重新指向rpc(序列化策略)文件的位置

以下是一个来自本网站的建议:

在apache配置中添加:

    ProxyPass /app/ ajp://localhost:8009/App-0.0.1-SNAPSHOT/

    <Location /app/>

    RequestHeader edit X-GWT-Module-Base ^(.*)/app/(.*)$ $1/App-0.0.1-SNAPSHOT/$2

    </Location>
ProxyPass/app/ajp://localhost:8009/App-0.0.1-快照/
RequestHeader编辑X-GWT-Module-Base^(.*)/app/(.*)$$1/app-0.0.1-SNAPSHOT/$2
希望我上面的建议至少能为某人指明正确的方向。
请让我们知道是否有人实现了此功能,并且可以正常工作。

您确定只有通过Apache访问时才会发生异常吗?您需要检查此假设。我认为即使您直接访问它,错误也会发生。该异常与反向代理无关。只有在Apache背后代理它时才会发生异常(我并不是说是Apache造成的)。当我直接访问应用程序时,不会发生此类异常。这不是一个假设,在发布问题之前,我检查了不止一次日志。我知道这个异常与反向代理没有直接关系,这就是我问这个问题的原因:)我认为还有一些地方出了问题——当你说非apache是托管/devmode或访问编译的js版本时。您是否可以检查两者是否运行相同版本的代码(缓存、不正确的构建等被排除在外)。在主页上进行一些可见的更改,并检查更改是否通过apache代理显示。该应用程序已部署到远程服务器,因此正在运行编译版本。我将部署的应用程序放在同一服务器上的反向代理后面。因此,在代理后面运行的和直接访问的是相同的。顺便说一句,代理不是缓存代理,它只是为了让URL在最终用户看来更漂亮。在我前面也有同样的问题。你的解决方案很好。如果您能够详细说明根本原因(相对目录?)或概述GWT序列化的结构(如果您知道的话),这将对其他人有益:)Thanks@Kaan-好的,我已经更新了我的解决方案,提供了更多细节。。。我自己还没有实现,所以请尝试一下,让每个人都知道它是否有效@谢谢你的更新,很好的建议和指针。我很快就不能尝试这个了。在那之前接受作为回答。
    ProxyPass /app/ ajp://localhost:8009/App-0.0.1-SNAPSHOT/

    <Location /app/>

    RequestHeader edit X-GWT-Module-Base ^(.*)/app/(.*)$ $1/App-0.0.1-SNAPSHOT/$2

    </Location>