如何从CDN提供GWT静态文件

问题描述 投票:2回答:3

我试图弄清楚如何从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>

哇! 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在同一个域中)

gwt cdn same-origin-policy
3个回答
2
投票

[GWT设置指向src脚本标签的modulename.nocache.js属性而不是文档的location的RPC的URL。

通常的解决方法是,将rpc服务的基本URL更改为指向html文件的location

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

注意:在这种情况下,您没有执行跨域,因为您的.htmlservices在同一主机中。

可选,如果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 documentation做的示例为例


2
投票

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

这是我用来用主机页面的URL替换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);

0
投票

请参阅此详细说明,您需要更新四个方面才能通过AWS CloudFront等CDN运行GWT应用程序。

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

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.