从不同的 url 启动应用程序时 GWT RPC 失败

GWT RPC fails when launching app from different urls

我正在使用 urls 导航到我的 GWT 应用程序中的不同屏幕。例如:

http://127.0.0.1/home
http://127.0.0.1/info/contact-us
http://127.0.0.1/app/index.html

我有一个服务于 html 的 servlet,其中包含 GWT 所需的脚本元素(我的 GWT 模块名称是 "app"):

<script type="text/javascript" language="javascript" src="/app/app.nocache.html">
</script>

这与 GWT 2.6.1 配合得很好。 在浏览器开发工具中,可以看到在 [=16] 处对我的 RemoteService 进行了 RPC 调用=]

问题是当我升级到 GWT 2.8 时,我的应用程序的 RPC 调用端点现在不同且错误,具体取决于所使用的 URL。例如:

http://127.0.0.1/home            -> http://127.0.0.1/rpc
http://127.0.0.1/info/contact-us -> http://127.0.0.1/info/rpc
http://127.0.0.1/app/index.html  -> http://127.0.0.1/app/rpc

对于上述 URLs,模块始终正确加载和执行,但 RPC 在前两种情况下失败。只有最后一个 URL 允许我的应用进行 RPC 调用。

可以通过将 client-side 服务代理转换为 ServiceDefTarget 并使用 setServiceEntryPoint() 来设置 RPC 端点。如下:

ourInstance = (MyRemoteServiceAsync)GWT.create(MyRemoteService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) ourInstance;
serviceDefTarget.setServiceEntryPoint("/app/rpc");

但是,请求负载仍然包含对不正确模块库的引用。在 RPC 请求上发送的 http headers 也有不正确的值:

X-GWT-Module-Base:http://127.0.0.1/foo/bar/

有没有办法强制客户端的RPC机制使用正确的RPCURL/app/rpc?或者也许是一种正确设置 module-base 的方法?

更新 1

在 GWT 2.7 中看到相同的行为。

此外,当部署在 WAR 中时,<module-hash>.cache.js 文件不会加载,因为它也是相对于 url 请求的。这非常糟糕,因为这意味着模块代码不会被缓存,因为这个 url 每次都不一样。需要在选择器 <module>.nocache.js 中进行修复。 在现实世界中,是否有人实际使用带有 url 链接的 GWT?

通过在 html 文档的 <head> 元素中指定一个 <meta> 元素,bootstrap nocache.js 选择器 javascript 将选择正确的模块 baseUrl。 baseUrl 必须是完全指定的绝对 url,并以 /.

结尾

对于我的示例,确切的元素是:

<head>
   ...
   <meta name="gwt:property" content="baseUrl=http://127.0.0.1/app/" />
   ...
</head>