Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在dropwizard中启用cors不起作用_Java_Dropwizard - Fatal编程技术网

Java 在dropwizard中启用cors不起作用

Java 在dropwizard中启用cors不起作用,java,dropwizard,Java,Dropwizard,我正在开发dropwizard应用程序和js ui,以便与api交互。我需要加载json数据来更新视图,但在此之前,我必须在dropwizard中启用cors。我做了一些工作人员,但它似乎不起作用,因为dropwizard始终不返回任何内容 @Override public void run(final BGConfiguration configuration, final Environment environment) throws Exception { final Map<S

我正在开发dropwizard应用程序和js ui,以便与api交互。我需要加载json数据来更新视图,但在此之前,我必须在dropwizard中启用cors。我做了一些工作人员,但它似乎不起作用,因为dropwizard始终不返回任何内容

@Override
public void run(final BGConfiguration configuration, final Environment environment) throws Exception {
  final Map<String, String> 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);
}
@覆盖
公共无效运行(最终BGConfiguration配置、最终环境)引发异常{
final Map params=new HashMap();
参数put(“访问控制允许原点”,“/*”;
参数put(“访问控制允许凭据”、“true”);
参数put(“访问控制公开头”,“true”);
参数put(“访问控制允许标头”、“内容类型,X-request-With”);
参数put(“访问控制允许方法”、“获取、发布、放置、删除、选项”);
servlets().addFilter(“cors”,CrossOriginFilter.class).setInitParameters(params);
}

这里的错误在于过滤器没有通过
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, "/*");
}
我假设您正在浏览器中进行实时测试,但您可以通过CLI使用如下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

您应该会在响应中看到一堆
访问控制-*
HTTP头。

增加了Mike Clarke的答案:

CHAIN\u PREFLIGHT\u PARAM
设置为false将允许此筛选器处理飞行前请求,而无需您的身份验证筛选器拦截
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");

您可以尝试这样做:

final FilterRegistration.Dynamic cors =
        environment.servlets().addFilter("CORS", CrossOriginFilter.class);

// Configure CORS parameters
// Configure CORS parameters
cors.setInitParameter("allowedOrigins", "*");
cors.setInitParameter("allowedHeaders", “<Headers>”);
cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,");

// Add URL mapping
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
最终过滤器注册。动态cors=
environment.servlets().addFilter(“CORS”,CrossOriginFilter.class);
//配置CORS参数
//配置CORS参数
cors.setInitParameter(“AllowedOriginates”、“*”);
cors.setInitParameter(“allowedHeaders”和“”);
setInitParameter(“allowedMethods”,“OPTIONS,GET,PUT,POST,”);
//添加URL映射
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class),true,“/*”;

如果您使用的是that@Mike克拉克希望我能早点看到你的评论。AngularJSforDropWizard 0.8.4需要将“allowedHeaders”设置为“*”,以使其在AngularJS应用程序中正常工作。仅供GWT用户参考,我还必须将“allowedHeaders”设置为“*”。如果没有它,GWT会抱怨飞行前请求的
响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。起源'http://localhost:9876因此不允许访问。
不要忘记导入javax.servlet.FilterRegistration