如何从CDN提供GWT静态文件



我正试图找出如何从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>

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

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

GWT.getModuleBaseForStaticFiles似乎是一种允许CDN使用的方法,但我找不到关于它的文档。(见注释)

是否有人知道正确的方法来设置GWT服务从CDN和发送RPC请求到主机页面的域?

注:

由于CDN有不同的域名和路径,我担心会有涉及同源策略的问题,但由于GWT主机页面与所有RPC请求在相同的域上服务,这不是问题。(即。窗口。位置与RPC相同)

GWT将rpc的url设置为指向modulename.nocache.js脚本标签的src属性,而不是文档的location

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

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

注意:在这种情况下,你没有做跨域,因为你的.html和你的services在同一个主机上。

可选地,如果services.html文件不在同一个主机上,则您正在执行跨域,因此您可以配置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文档

中所做的示例

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

下面是我用来用主机页面的url替换moduleBaseURL的代码。它允许我在所有RemoteService接口上使用现有的@RemoteServiceRelativePath注释。

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);

查看您需要更新的四个方面的详细说明,以便在CDN(如AWS CloudFront)上运行GWT应用。

https://groups.google.com/forum/?fromgroups !主题/google web toolkit/4 eny2rilh1k

希望对你有帮助。

最新更新