如何从CDN服务GWT静态文件
我试图弄清楚如何从CDN而不是从tomcat服务器为我的GWT文件提供服务 我从这个代码开始如何从CDN服务GWT静态文件,gwt,cdn,same-origin-policy,Gwt,Cdn,Same Origin Policy,我试图弄清楚如何从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-ind
<!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是同一个域)因此答案似乎是为每个RPC接口手动调用
ServiceDefTarget.setServiceEntryPoint()
下面是我用来将moduleBaseURL
替换为主机页url的代码。它允许我在所有RemoteService
接口上使用现有的@remoteservicereparatePath
注释
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);
因此,答案似乎是为每个RPC接口手动调用
ServiceDefTarget.setServiceEntryPoint()
下面是我用来将moduleBaseURL
替换为主机页url的代码。它允许我在所有RemoteService
接口上使用现有的@remoteservicereparatePath
注释
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);
GWT设置指向
modulename.nocache.js
脚本标记的src
属性的RPC的url,而不是文档的位置
解决此问题的正常方法是更改rpc
服务的基本url,使其指向html文件的位置
GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
((ServiceDefTarget)greetingService)
.setServiceEntryPoint("http://hostname_of_your_document/modulename/greet");
注意:在这种情况下,您没有进行跨域操作,因为您的.html
和服务
位于同一主机中
或者,如果服务
与.html
文件不在同一主机中,则您正在进行跨域操作,因此您可以将servlet配置为支持。最好的方法是在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>
克斯菲尔特
com.example.server.CORSFilter
克斯菲尔特
/*
对于filter类,您可以以我为GWT设置的url为例,它指向modulename.nocache.js
脚本标记的src
属性,而不是文档的位置
解决此问题的正常方法是更改rpc
服务的基本url,使其指向html文件的位置
GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
((ServiceDefTarget)greetingService)
.setServiceEntryPoint("http://hostname_of_your_document/modulename/greet");
注意:在这种情况下,您没有进行跨域操作,因为您的.html
和服务
位于同一主机中
或者,如果服务
与.html
文件不在同一主机中,则您正在进行跨域操作,因此您可以将servlet配置为支持。最好的方法是在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>
克斯菲尔特
com.example.server.CORSFilter
克斯菲尔特
/*
对于filter类,您可以以我为所做的示例为例,查看以下四个方面的详细说明,您需要更新这些内容才能在像AWS CloudFront这样的CDN上运行GWT应用程序
希望这能有所帮助。请参阅以下四个方面的详细说明,在AWS CloudFront之类的CDN上运行GWT应用程序需要更新这些方面
希望对您有所帮助。FYIgetModuleBaseForStaticFiles
已经为超级开发模式引入:静态文件由超级开发模式代码服务器提供服务,但是getModuleBaseURL
是您自己的服务器,它也为getHostPageBaseURL
提供服务。仅供参考getModuleBaseForStaticFiles
已为超级开发模式引入:静态文件由SuperDevMode CodeServer提供服务,但是getModuleBaseURL
是您自己的服务器,它也提供getHostPageBaseURL
。谢谢,第一部分是正确的,但是如果您仔细阅读我的问题,您会发现CORS不是必需的,因为“主机页”不是由CDN提供的。因此,Window.Location
属性中的域与xmlhttprequest的域匹配。因为CORS的作品可能对很多其他人有用,所以无论如何都要投票。明白了。因此,您必须手动设置serviceEntryPoint,因为在afaik中,gwt根据文档中与您的module\u name.nocache.js
匹配的script
标记的src计算主机名。其他选项可能是重写gwt用于计算名称的算法,或者在真正的nocache
脚本之前,在文档中放置一个名称相同、主机不同的空脚本。我接受了你的答案(我想你可以使用rep,加上我对GWTQuery很感兴趣)。您能否更新您的答案以表明CORS是可选的?谢谢,第一部分是正确的,但是如果您仔细阅读我的问题,您将看到CORS不是必需的,因为“主机页”不是由CDN提供的。因此,Window.Location
属性中的域与xmlhttprequest的域匹配。因为CORS的作品可能对很多其他人有用,所以无论如何都要投票。明白了。因此,您必须手动设置serviceEntryPoint,因为在afaik中,gwt根据文档中与您的module\u name.nocache.js
匹配的script
标记的src计算主机名。其他选择可能是重写gwt使用的算法