2

我试图弄清楚如何从 CDN 而不是从 tomcat 服务器提供我的 GWT 文件。

我从这段代码开始

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="robots" content="no-index, no-follow" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>My Site</title>
<script type="text/javascript" src="/bcmjs/bcmjs.nocache.js"></script>
</head>

<body>
<div id="gwt_div">
</div>
</body>
</html>

并修改了 javascript 导入以使用 CDN url,来自:

<script type="text/javascript" src="/bcmjs/bcmjs.nocache.js"></script>

对此:

<script type="text/javascript" src="https://uoo9w.cloudfront.net/bcmjs/bcmjs.nocache.js"></script>

万岁!js 下载,UIBinder 小部件可见,但 RPC 失败。

问题似乎是GWT.getModuleBase返回 Javascript 的 URL (uoo9w.cloudfront.net) 而不是主机页面 (mysite.example.com),这会破坏诸如用于 RPC 请求的 URL 之类的东西。

GWT.getModuleBaseForStaticFiles似乎是一种允许使用 CDN 的方法,但我找不到有关它的文档。 (看评论)

有谁知道设置 GWT 以从 CDN 提供服务并将 RPC 请求发送到主机页面域的正确方法?

边注:

由于 CDN 具有不同的域名和路径,我担心会出现涉及同源策略的问题,但由于 GWT 主机页面与所有 RPC 请求在同一个域上提供服务,所以这不是问题。(即 Window.Location 与 RPC 的域相同)

4

3 回答 3

2

所以答案似乎是手动调用ServiceDefTarget.setServiceEntryPoint()每个 RPC 接口

这是我用来替换moduleBaseURL主机页面 url 的代码。它让我可以在所有界面上使用现有的@RemoteServiceRelativePath注释。RemoteService

public static native String getHostpageUrl()/*-{
   return $wnd.location.protocol + "//" + $wnd.location.host + "/";
}-*/;

GreetingServiceAsync greetingService = GWT.create(GreetingService.class);

ServiceDefTarget serviceDefTarget= ((ServiceDefTarget)greetingService);
String oldUrl = serviceDefTarget.getServiceEntryPoint();
String newServiceEntryPoint =  oldUrl.startsWith(GWT.getModuleBaseURL()) ? 
        getBaseUrl() + "module/" + oldUrl.substring(GWT.getModuleBaseURL().length(), value.length()) 
       : oldUrl;
serviceDefTarget.setServiceEntryPoint(newServiceEntryPoint);
于 2012-12-21T06:57:46.533 回答
2

GWT 设置 RPC 的 url 指向script-tag的src属性而不是文档的属性。modulename.nocache.jslocation

修复它的正常方法是将服务的基本 url 更改rpc为指向locationhtml 文件的

GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
((ServiceDefTarget)greetingService)
   .setServiceEntryPoint("http://hostname_of_your_document/modulename/greet");

注意:在这种情况下,您不是跨域,因为您.html和您services在同一主机中。

可选地,如果 与文件services不在同一主机中.html,则您正在执行crossdomain,因此您可以配置您的 servlet 以支持CORS。最好的方法是在您的web.xml

<filter>
  <filter-name>corsFilter</filter-name>
  <filter-class>com.example.server.CORSFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>corsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

对于过滤器类,您可以使用我为gwtquery Ajax 文档所做的示例

于 2012-12-21T08:24:03.827 回答
0

请参阅此详细说明,了解您需要更新以从 AWS CloudFront 等 CDN 运行 GWT 应用程序的四个方面。

https://groups.google.com/forum/?fromgroups#!topic/google-web-toolkit/4eNY2RiLH1k

希望有帮助。

于 2013-06-17T23:03:45.520 回答