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 同源策略解决方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中使用 document.domain 的同源策略解决方法

什么是跨域?跨域解决方法

跨域问题的九种解决方法

GWT SSL + Jetty + 同源策略 = 混乱

Django - - 同源策略和跨域解决方案

造成跨域的原因和解决方法