Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从CDN服务GWT静态文件_Gwt_Cdn_Same Origin Policy - Fatal编程技术网

如何从CDN服务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

我试图弄清楚如何从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是同一个域)

因此答案似乎是为每个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应用程序需要更新这些方面


希望对您有所帮助。

FYI
getModuleBaseForStaticFiles
已经为超级开发模式引入:静态文件由超级开发模式代码服务器提供服务,但是
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使用的算法