【问题标题】:CORS request to DropWizard based API failing in IE, Edge and Safari but working in Chrome and Firefox对基于 DropWizard 的 API 的 CORS 请求在 IE、Edge 和 Safari 中失败,但在 Chrome 和 Firefox 中有效
【发布时间】:2017-03-22 19:11:41
【问题描述】:

我正在使用 Dropwizard v1.0.0 并实现了 CORS,但请求它在 Safari、IE 和 Edge 中失败。但是,它可以在 Firefox 和 Chrome 中运行。

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

cors.setInitParameter(ALLOWED_ORIGINS_PARAM, "*");
cors.setInitParameter(ALLOWED_HEADERS_PARAM, "Content-Type,Access-Control-Allow-Origin,Authorization");
cors.setInitParameter(ALLOWED_METHODS_PARAM, "OPTIONS,HEAD,DELETE,GET,PUT,POST,PATCH,HEAD");
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");

此代码应用在 XYZApplication.java 中。

我在控制台中收到的错误消息是:

加载资源失败:Access-Control-Allow-Origin 不允许 Origin https://xyz.in

这是来自 Edge 的 OPTIONS 请求标头:

Accept: */*
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: access-control-allow-origin,authorization, accept
Access-Control-Request-Method: GET
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 0
Host: xyz-api.in
Origin: https://xyz.in
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393

以下是来自 Chrome 的 OPTIONS 请求标头:

Host: xyz-api.in
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: GET
Origin: https://xyz.in
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.35 Safari/537.36
Access-Control-Request-Headers: access-control-allow-origin, authorization
Accept: */*
Referer: https://xyz.in/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8

请让我知道我错过了什么或任何其他需要的细节。

【问题讨论】:

  • “它失败了”不能很好地描述问题。它是如何失败的?开发者工具控制台中报告了哪些错误消息?网络选项卡说什么?对于正常工作的浏览器和失败的浏览器,请求和响应的组合有什么不同?
  • @Quentin 添加了更多详细信息,包括控制台中的错误消息以及 Chrome 和 Edge 上的请求标头。如果需要更多详细信息,请告诉我。
  • "Origin xyz.in is not allowed" … "Origin: xyz.zapr.in" … "Origin: adimprints.zapr.in" — 这些来源都不匹配,看起来像您有三个不同的页面,并且请求是由其中两个触发的,错误消息来自第三个请求。
  • @Quentin 我有 1 个仪表板,即 xyz.in 和 1 个 api (xyz-api.in)。我已经更正了细节。

标签: safari cors dropwizard microsoft-edge


【解决方案1】:

试试这个:

import static javax.ws.rs.core.HttpHeaders.*;

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

cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, environment.getApplicationContext().getContextPath() + "*");
cors.setInitParameter(ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,HEAD,OPTIONS");
cors.setInitParameter(ALLOWED_ORIGINS_PARAM, "*");
cors.setInitParameter(ALLOWED_HEADERS_PARAM, "*");
cors.setInitParameter(EXPOSED_HEADERS_PARAM, "Link");
cors.setInitParameter(ALLOW_CREDENTIALS_PARAM, "true");

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多