2013-10-15 23 views
2

我正在使用Dropwizard,我将托管,以及一个网站,在谷歌云(GCE)上。这意味着,有2处当前处于活动状态:如何修复服务器和网站的跨站点源策略

Some.IP.Address - UI Some.IP.Address:8080 - Dropwizard服务器

当UI尝试从我dropwizard服务器调用什么,我得到跨站点原点错误,这是可以理解的。但是,这对我来说是一个问题。我该如何解决?如果我能以某种方式欺骗这些地址,这将是非常好的,这样我就不必在UI中完全限定资源。

什么,我要做到这一点是:

$获得( '/供应商/上传/ display_information')

或者,如果我必须完全限定

$不用彷徨('http://Some.IP.Address:8080/provider/upload/display_information')

我试着在Dropwizard中通过这个谷歌组线程(https://groups.google.com/forum/#!topic/dropwizard-user/ybDOTOxjlLI)设置原始过滤器,但它似乎没有工作。

+0

[避开相同来源策略的方式]的可能重复(http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy) – Quentin

回答

2

在由服务器在http://Some.IP.Address服务的index.html中,您可能有一个如下所示的jQuery脚本。

$.get('http://Some.IP.Address:8080/provider/upload/display_information', data, callback); 

当然,由于同源策略(SOP),您的浏览器将不允许访问http://Some.IP.Address:8080。协议(http,https)和主机以及端口必须相同。

要在Dropwizard上实现跨源资源共享(CORS),您必须向Servlet环境添加CrossOriginFilter。该过滤器将为服务器发送的每个响应添加一些Access-Control-Headers。在您的Dropwizard应用程序写入的run方法:

import org.eclipse.jetty.servlets.CrossOriginFilter; 

public class SomeApplication extends Application<SomeConfiguration> { 

    @Override 
    public void run(TodoConfiguration config, Environment environment) throws Exception { 
     FilterRegistration.Dynamic filter = environment.servlets().addFilter("CORS", CrossOriginFilter.class); 
     filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); 
     filter.setInitParameter("allowedOrigins", "http://Some.IP.Address"); // allowed origins comma separated 
     filter.setInitParameter("allowedHeaders", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin"); 
     filter.setInitParameter("allowedMethods", "GET,PUT,POST,DELETE,OPTIONS"); 
     filter.setInitParameter("preflightMaxAge", "5184000"); // 2 months 
     filter.setInitParameter("allowCredentials", "true"); 

     // ... 
    } 

    // ... 

} 

该解决方案适用于Dropwizard 0.7.0,可以在https://groups.google.com/d/msg/dropwizard-user/xl5dc_i8V24/gbspHyl4y5QJ找到。

此过滤器将为每个响应添加一些Access-Control-Headers。有关CrossOriginFilter的初始化参数的详细说明,请参阅http://www.eclipse.org/jetty/documentation/current/cross-origin-filter.html