使dropwizard中的cors无法正常工作

我正在研究一个dropwizard应用程序和js ui来与api交互。 我需要加载json数据来更新视图,但我必须在之前启用dropwizard中的cors。 我做了一些工作人员,但它似乎无法正常工作,因为dropwizard总是返回204没有内容。

@Override public void run(final BGConfiguration configuration, final Environment environment) throws Exception { final Map params = new HashMap(); params.put("Access-Control-Allow-Origin", "/*"); params.put("Access-Control-Allow-Credentials", "true"); params.put("Access-Control-Expose-Headers", "true"); params.put("Access-Control-Allow-Headers", "Content-Type, X-Requested-With"); params.put("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); environment.servlets().addFilter("cors", CrossOriginFilter.class).setInitParameters(params); } 

这里的错误是filter尚未通过addMappingForUrlPatterns方法配置URL路径。

这对我使用dropwizard 0.7.1:

 import org.eclipse.jetty.servlets.CrossOriginFilter; import javax.servlet.DispatcherType; import java.util.EnumSet; public void run(Configuration conf, Environment environment) { // Enable CORS headers final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); // Configure CORS parameters cors.setInitParameter("allowedOrigins", "*"); cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } 

我假设您正在浏览器中进行实时测试,但是您可以通过CLIvalidation这样的curl命令:

 $ curl -H "Origin: http://example.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: X-Requested-With" \ -X OPTIONS --verbose \ http://localhost:8080 

您应该在响应中看到一堆Access-Control-* HTTP标头。

加入Mike Clarke的回答:

CHAIN_PREFLIGHT_PARAM设置为false将使此filter处理预检请求,而不会使您的身份validationfilter拦截200响应并将其转换为未授权/禁止。

 import org.eclipse.jetty.servlets.CrossOriginFilter; import javax.servlet.DispatcherType; import java.util.EnumSet; public void run(Configuration conf, Environment environment) { // Enable CORS headers final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); // Configure CORS parameters cors.setInitParameter("allowedOrigins", "*"); cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); // DO NOT pass a preflight request to down-stream auth filters // unauthenticated preflight requests should be permitted by spec cors.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, Boolean.FALSE.toString()); } 

我很惊讶我没有在包含此配置的互联网上找到任何示例。 花了几天时间试图解决这个问题。

对我来说,即使配置了上述内容,也无法正常工作。 最终我发现我还必须允许缓存控制头。

filter.setInitParameter(“allowedHeaders”,“Cache-Control,If-Modified-Since,Pragma,Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin”);