GWT 同源策略解决方法?
Posted
技术标签:
【中文标题】GWT 同源策略解决方法?【英文标题】:GWT same origin policy workaround? 【发布时间】:2016-05-22 10:55:03 【问题描述】:假设我有一个网站,其静态资产托管在 CDN(例如 AWS CloudFront)中,但是,所有 GWT-RPC 调用都将在域主机中处理。如何在 GWT 中实现这一点?
【问题讨论】:
Colin Alworth 已经回答了这个问题:***.com/questions/14356993/… 看起来添加“”可以解决问题——我可以让 CloudFront 为静态资产提供服务,而我的真实网站主机则负责处理 Ajax请求。 @injoy 除了您的 GWT 代码也必须来自您的服务器并且它可能会变得很大;请参阅gwtproject.org/doc/latest/… 并从同一页面引用我的回答中的 jsonp 解决方案:gwtproject.org/doc/latest/… 【参考方案1】:正如@robert 提到的,CORS 是另一种选择,但它不需要对您的客户端代码进行任何更改 - 如果浏览器足够新以支持 CORS,那么您只需调用远程服务器,并确保远程服务器支持它。
根据您使用的服务器,支持会略有不同。 https://www.w3.org/wiki/CORS_Enabled 列出了不同的服务器以及如何启用 CORS,具体取决于您使用的是什么,以及您是在整个服务器中启用它,还是仅在应用程序的单个部分中启用它。
例如在码头:
<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 中:
过滤器 org.apache.catalina.filters.CorsFilter 过滤器 /*
也可以修改你的 RemoteServiceServlet 类来处理这个问题,但它的缺点是需要更全面地理解规范并确保你正确处理它。
与 JSONP 一样,允许跨域请求具有重要的安全含义。与 JSONP 不同,CORS 规范包含缓解此问题的功能,并确保浏览器不会尝试从错误的主机页面调用远程服务器 - 您可以限制调用,使其仅来自特定域。具体的标头是Access-Control-Allow-Origin
,虽然它可以分配给*
,意思是“所有服务器”,但您可能希望限制它以避免对您的应用程序的潜在XSRF攻击 - 对于上述示例,这是通过init管理的 -参数,请查看容器的文档以了解具体细节。此外,更改 url-pattern 可以限制这些过滤器应用的 url,可以限制可以远程请求的内容。
【讨论】:
看起来添加“”可以解决问题——我可以让 CloudFront 为静态资产提供服务,而我的真实网站主机则负责处理 Ajax请求。【参考方案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。
【讨论】:
看起来添加“”可以解决问题——我可以让 CloudFront 为静态资产提供服务,而我的真实网站主机则负责处理 Ajax请求。 @injoy 除了你的 gwt 代码也必须来自你的服务器并且它可以变得很大;见gwtproject.org/doc/latest/…?并从同一页面引用我的回答中的 jsonp 解决方案:gwtproject.org/doc/latest/…?以上是关于GWT 同源策略解决方法?的主要内容,如果未能解决你的问题,请参考以下文章