2016-02-11 2 views
1

Предположим, что у меня есть веб-сайт, статические активы которого размещены в CDN (скажем, AWS CloudFront), однако все вызовы GWT-RPC будут обрабатываться на хостах домена. Как я могу достичь этого в GWT?GWT такой же изначальный полис способ работы?

+0

Колин Алворт уже ответил на этот вопрос: http://stackoverflow.com/questions/14356993/getting-around-gwt-same-origin-policy –

+0

Похоже, добавить « «решит проблему - я могу обладать CloudFront для статических активов, пока мои настоящие веб-хосты заботятся о запросах Ajax. – injoy

+0

@injoy, за исключением того, что ваш код GWT должен будет поступать с вашего сервера, и он может стать большим; См. Http://www.gwtproject.org/doc/latest/FAQ_Server.html # What_is_the_Same_Origin_Policy, _and_how_does_it_affect_GWT И с той же страницы ссылка на jsonp-решение в моем ответе: http://www.gwtproject.org/doc/latest/FAQ_Server.html#How_can_I_dynamically_fetch_JSON_feeds_from_other_web_domains – robert

ответ

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.

+0

Похоже, добавление имени "решит проблему - я могу обладать CloudFront для статических активов, в то время как мои настоящие хосты веб-сайтов заботятся о запросах Ajax. – injoy

+0

@injoy, за исключением того, что ваш код gwt должен будет поступать с вашего сервера, и он может стать большим; См. Http://www.gwtproject.org/doc/latest/FAQ_Server.html#What_is_the_Same_Origin_Policy,_and_how_does_it_affect_GWT? И с той же страницы ссылка на jsonp-решение в моем ответе: http://www.gwtproject.org/doc/latest/FAQ_Server.html#How_can_I_dynamically_fetch_JSON_feeds_from_other_web_domains? – robert

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 /*

It также можно изменить класс RemoteServiceServlet, чтобы справиться с этим, но это имеет недостаток, заключающийся в необходимости более полного понимания спецификации и обеспечения правильной работы с ней.

Как и в случае с JSONP, существуют важные последствия для защиты разрешений на междоменные запросы. В отличие от JSONP, спецификация CORS включает в себя функции для смягчения этого и гарантирует, что браузер не пытается совершать вызовы на ваш удаленный сервер с неправильной главной страницы - вы можете ограничить вызовы, чтобы они поступали только из определенных доменов. Конкретный заголовок Access-Control-Allow-Origin, и хотя он может быть назначен *, что означает «все серверы», вы, вероятно, захотите ограничить его, чтобы избежать возможных атак XSRF против вашего приложения, - в приведенных выше примерах это управляется с помощью параметров init, проверьте ваши контейнерную документацию для конкретных деталей. Кроме того, изменение url-шаблона может ограничивать URL-адреса, к которым применяются эти фильтры, может ограничивать то, что можно запросить удаленно.

+0

Похоже, что добавление «" решит проблему - я могу обладать CloudFront статическими ресурсами, пока мои настоящие хосты веб-сайта заботятся о запросах Ajax. – injoy

Смежные вопросы