我正在谷歌云(GCE)上使用我正在托管的Dropwizard和一个网站。这意味着当前有2个位置处于活动状态:
Some.IP.Address - UI Some.IP.Address:8080 - Dropwizard服务器
当UI尝试从我的dropwizard服务器调用任何内容时,我会收到跨站点原始错误,这是可以理解的。但是,这对我来说是一个问题。我该如何解决?如果我能以某种方式欺骗地址,那将是很好的,这样我就不必完全限定UI中的资源。
我要做的是:
$。获得( '/供应商/上传/ display_information')
或者,如果我必须完全符合资格
$。获得( 'http://Some.IP.Address:8080/provider/upload/display_information')
我尝试按照这个google群组线程(https://groups.google.com/forum/#!topic/dropwizard-user/ybDOTOxjlLI)在Dropwizard中设置Origin Filters,但它似乎不起作用。
答案 0 :(得分: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),您必须将一个CrossOriginFilter添加到servlet环境中。此过滤器将为服务器发送的每个响应添加一些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。