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

Kaa*_*aan 8 gwt reverse-proxy gwt-rpc

我正在Glassfish 3.0.1上部署GWT 2.4应用程序.我可以通过http:// host:PORT/appContext / 轻松访问我的应用程序
但是,当我使用Apache反向代理应用程序时,我会得到以下摘录的异常(来自Glassfish日志):

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

实施IsSerializable解决了Chi相关问题中所建议的问题.相关问题中还有其他解决方法.

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

注意:如果直接联系应用程序,则不会发生异常.

注2:与异常相关的类已经实现了Serializable接口,就GWT而言,它应该等同于IsSerializable.

jas*_*sop 4

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

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

编辑

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

首先,查看有关这些 rpc 文件的 GWT 帮助: https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files

你会注意到它说:

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

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

以下是取自该网站的一项建议:http://code.google.com/p/google-web-toolkit/issues/detail ?id=4817

    public class MyRemoteServiceServlet extends RemoteServiceServlet
    {

    ...

    @Override
    protected SerializationPolicy doGetSerializationPolicy(
            HttpServletRequest request, String moduleBaseURL, String strongName) {
            //get the base url from the header instead of the body this way 
            //apache reverse proxy with rewrite on the header can work
            String moduleBaseURLHdr = request.getHeader("X-GWT-Module-Base");

            if(moduleBaseURLHdr != null){
                    moduleBaseURL = moduleBaseURLHdr;
            }

            return super.doGetSerializationPolicy(request, moduleBaseURL, strongName);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

希望我上面的建议至少能为某人指明正确的方向。如果有人实现了这个并且它有效,请告诉我们。