我试图弄清楚如何从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网址:
<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(uoo9w.cloudfront.net)的URL而不是主页(mysite.example.com),这会破坏用于RPC请求的URL
(参见评论) GWT.getModuleBaseForStaticFiles
似乎是一种允许CDN使用的方法,但我无法找到有关它的文档。
有没有人知道设置GWT从CDN提供并将RPC请求发送到主机页面域的正确方法?
旁注:
由于CDN具有不同的域名和路径,我担心会出现涉及同源策略的问题,但由于GWT主机页面与所有RPC请求在同一域上提供,因此不是一个问题。 (即Window.Location是与RPC相同的域)
答案 0 :(得分:2)
所以答案似乎是为每个RPC接口手动调用ServiceDefTarget.setServiceEntryPoint()
以下是我用来将moduleBaseURL
替换为主页的网址的代码。它允许我在所有@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);
答案 1 :(得分:2)
GWT设置RPC的url指向src
脚本标记的modulename.nocache.js
属性,而不是文档的location
。
解决此问题的常用方法是将rpc
服务的基本网址更改为指向html文件的location
GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
((ServiceDefTarget)greetingService)
.setServiceEntryPoint("http://hostname_of_your_document/modulename/greet");
注意:在这种情况下,由于您的.html
和services
位于同一主机中,因此您不会执行跨域。
可选地,如果services
与.html
文件不在同一主机中,那么您正在执行 crossdomain ,因此您可以将servlet配置为支持{{ 3}}。最好的方法是在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>
对于过滤器类,您可以采用我为CORS
所做的示例答案 2 :(得分:0)
请参阅此详细说明您需要更新以从AWS CloudFront等CDN运行GWT应用程序的四个方面。
https://groups.google.com/forum/?fromgroups#!topic/google-web-toolkit/4eNY2RiLH1k
希望有所帮助。