GWT同源政策解决方案?

时间:2016-02-11 15:18:44

标签: gwt cdn same-origin-policy

假设我的网站的静态资产托管在CDN(例如,AWS CloudFront)中,但是,所有GWT-RPC调用都将在域主机中处理。我怎样才能在GWT中实现这一目标?

2 个答案:

答案 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