JAX-RS:仅在使用 Restangular 客户端进行 DELETE 时没有 'Access-Control-Allow-Origin' CORS 错误

JAX-RS: No 'Access-Control-Allow-Origin' CORS error only on DELETE with Restangular client

我有一个关于特定 CORS 相关问题的问题:已在 JAX-RS 上设置服务器端 CORS 配置,使其正常工作 GETPUTPOST,我无法让它与 DELETE 请求一起工作。

我已经按照说明设置了 JAX-RS 请求/响应过滤器 here and here:

对于 "preflight OPTIONS" 个请求:

@Provider
@PreMatching
public class CorsOptionsPreflightRequestFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestCtx) throws IOException {
        if (requestCtx.getRequest().getMethod().equals("OPTIONS")) {
            requestCtx.abortWith(Response.status(Response.Status.OK).build());
        }
    }
}

对于实际的 CORS 处理:

@Provider
@PreMatching
public class CorsResponseFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestCtx, ContainerResponseContext responseCtx) throws IOException {
        responseCtx.getHeaders().add("Access-Control-Allow-Origin", "*");
        responseCtx.getHeaders().add("Access-Control-Allow-Credentials", "true");
        responseCtx.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        responseCtx.getHeaders().addAll("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
    }
}

我正在 Google Chrome 上测试 the CORS plugin 已激活。

同样,GET、PUT 和 POST 请求完美运行,但 DELETE 产生错误:

XMLHttpRequest cannot load http://localhost:8080/serverApplication/persons/3. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 400.

注意:我只对使用 JAX-RS 标准的解决方案感兴趣,没有特定于供应商(例如 RESTeasy,Spring)的解决方案。

我错过了什么?


编辑 1:

此外,当在 CorsResponseFilter#filter() 中设置调试断点时,它永远不会在 DELETE 请求中到达,但在 GET / POST 请求中它是。从 curl 控制台执行时,DELETE 也能正常工作。

编辑 2:

客户端是用Restangular.

写的

抱歉,提示错误。

令我惊讶的是,实际问题出在用 Restangular 编写的客户端中。

"magical" 解决方案是告诉 Restangular 发送没有正文的 DELETE 请求,如 this issue:

中所述
RestangularProvider.setRequestInterceptor(function(elem, operation) {
  if (operation === "remove") {
     return undefined;
  } 
  return elem;
})

否则,DELETE 请求会触发 400 错误,我怀疑浏览器错误地将其解释为 CORS 错误,因此在控制台中输出以上 CORS-related 错误消息。