假设我的网站的静态资产托管在CDN(例如,AWS CloudFront)中,但是,所有GWT-RPC调用都将在域主机中处理。我怎样才能在GWT中实现这一目标?
答案 0 :(得分:3)
正如@robert所提到的,CORS是另一种选择,但它不需要对客户端代码进行任何更改 - 如果浏览器足够新以支持CORS,那么你所做的就是拨打电话到远程服务器,并确保远程服务器支持它。
根据您使用的服务器,支持将略有不同。 https://www.w3.org/wiki/CORS_Enabled包含不同服务器的列表以及如何启用CORS,具体取决于您使用的内容,以及是在整个服务器上启用它,还是仅在应用程序的单个部分中启用它。
例如,在Jetty:
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在Tomcat中:
CorsFilter org.apache.catalina.filters.CorsFilter CorsFilter / *
也可以修改你的RemoteServiceServlet类来处理这个问题,但它的缺点是需要更全面地理解规范并确保你正确处理它。
与JSONP一样,允许跨域请求有重要的安全隐患。与JSONP不同,CORS规范包含缓解此功能的功能,并确保浏览器不会尝试从错误的主机页面调用远程服务器 - 您可以限制调用以使它们仅来自特定域。特定标头为Access-Control-Allow-Origin
,虽然可以将其分配给*
,意思是&#34;所有服务器&#34;,您可能希望限制它以避免针对您的应用程序的潜在XSRF攻击 - 以上示例通过init-parameters进行管理,查看容器的文档以获取具体细节。此外,更改url-pattern可以限制这些过滤器应用的URL可以限制远程请求的内容。
答案 1 :(得分:2)
您可以尝试使用CORS(https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS)
这样的事情:
public class CrossSiteRpcRequestBuilder extends RpcRequestBuilder {
@Override
protected RequestBuilder doCreate(String serviceEntryPoint) {
RequestBuilder requestBuilder=super.doCreate(serviceEntryPoint);
requestBuilder.setIncludeCredentials(true);
return requestBuilder;
}
}
public class CrossSiteRpcRequestBuilderFactory {
public RpcRequestBuilder get() {
return new CrossSiteRpcRequestBuilder();
}
}
RpcRequestBuilder rpcRequestBuilder=((CrossSiteRpcRequestBuilderFactory) GWT.create(CrossSiteRpcRequestBuilderFactory.class)).get();
rpcRequestBuilder.create("{YOUR_HOST}/cors_handshake");
rpcRequestBuilder.setContentType("text/x-gwt-rpc; charset=utf-8");
rpcRequestBuilder.setRequestData("cors handshake");
rpcRequestBuilder.setCallback(new RequestCallback() {
...
});
RequestBuilder r=rpcRequestBuilder.finish();
r.send();
另一种方法是使用您的服务器作为远程服务器的代理(带宽)。
总结:
我会使用JsonpRequestBuilder而不是RPC,它不太方便,但保证可以工作(与CORS不同)。
有关详细信息,请参阅http://www.gwtproject.org/doc/latest/tutorial/Xsite.html。