在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。查看http://www.eclipse.org/jetty/documentation/current/cross-origin-filter.html了解 CrossOriginFilter 初始化参数的详细说明。