当前位置: 首页 > 知识库问答 >
问题:

在dropwizard中启用cors不起作用

伏建修
2023-03-14

我正在开发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);
}

共有3个答案

姜俊逸
2023-03-14

对我来说,即使在配置了上述功能之后,它也不起作用。最终证明,我还必须允许缓存控制头。

filter.setInitParameter("allowedHeaders",
"Cache-Control,If-Modified-Since,Pragma,Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
从智志
2023-03-14

迈克·克拉克的回答补充道:

CHAIN_PREFLIGHT_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());
}

我感到惊讶的是,我在互联网站上没有找到任何包含此配置的示例。花了几天时间想弄明白这一点。

苏弘盛
2023-03-14

这里的错误在于过滤器没有通过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头。

 类似资料:
  • 我已经有效地使用 wiremock 一段时间了,我想启用 CORS 对模拟 API 的访问。 我尝试在响应标头中设置访问控制允许来源:* 和其他标头,但都无济于事。 这是我的一个映射示例: 我到底做错了什么导致CORS无法工作? 提前谢谢。

  • 这里使用Ajax:

  • 问题内容: 我的Django版本是1.8.6。我已将corsheaders文件夹复制到项目文件夹中。我已经点安装django-cors-headers(ver 1.1.0)。这是我的setting.py: 这是我的jQuery: 在执行getLeague()时,它会不断提醒“失败”。当我看到控制台时,它显示“ XMLHttpRequest无法加载http://otherdomain.ashx?us

  • 所以,基本上,前端使用reactJS,后端Spring Boot(微服务,zuul充当网关),当然,如果没有CORS的东西,他们什么也做不了。 我们使用了这段代码 它起作用了,但不再起作用了。我正在使用Postman检查发送回来的标头,但这些都不在那里。 我该怎么办?我可以在每个微服务中使用一个简单的CORS过滤器,但让Zuul处理这一切会容易得多。因为无论如何所有请求都会通过它。 有什么建议吗?

  • 如何在Spring5WebFlux项目中启用CORS? 我找不到合适的留档。

  • 问题内容: 我已经使用SLIM PHP框架创建了一个基本的RESTful服务,现在我正尝试将其连接起来,以便可以从Angular.js项目访问该服务。我已经了解到Angular开箱即用地支持CORS,而我要做的就是在我的.htaccess文件中添加以下行: 我已经做到了,我的REST应用程序仍然可以正常工作(.htaccess错误导致500个内部服务器没有错误),但是当我尝试从test- cors