JAX-RS:No';访问控制允许原点';仅在使用重新启动的客户端删除时出现CORS错误

JAX-RS:No';访问控制允许原点';仅在使用重新启动的客户端删除时出现CORS错误,cors,jax-rs,restangular,Cors,Jax Rs,Restangular,对于一个与CORS相关的特定问题,我有一个问题:在JAX-RS上设置了服务器端CORS配置,使其能够正确地用于GET、PUT和POST,我无法让它处理删除请求 我已经设置了JAX-RS请求/响应过滤器,如下所述: 对于“飞行前选项”请求: @Provider @PreMatching public class CorsOptionsPreflightRequestFilter implements ContainerRequestFilter { @Override public

对于一个与CORS相关的特定问题,我有一个问题:在JAX-RS上设置了服务器端CORS配置,使其能够正确地用于GET、PUT和POST,我无法让它处理删除请求

我已经设置了JAX-RS请求/响应过滤器,如下所述:

对于“飞行前选项”请求:

@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");
    }
}
我正在谷歌Chrome上测试激活

同样,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()
中设置调试断点时,删除请求永远不会到达该断点,但GET/POST请求却会到达。当从
curl
控制台执行DELETE时,DELETE也能很好地工作

编辑2:

客户端是以重新启动语言写入的

抱歉,警报错误

我发现,令我惊讶的是,真正的问题在于用restanglar编写的客户机

“神奇”的解决方案是告诉Restangular在没有正文的情况下发送删除请求,如中所述:


否则,删除请求会触发一个400错误,我怀疑浏览器错误地将其解释为CORS错误,从而在控制台中输出上述与CORS相关的错误消息。

我无法告诉您问题出在哪里,但我在几个月前实现了相同的功能。请参见此处:。附带的测试确保它符合此规范()@RJinman注意,CORS的当前规范实际上是,您可能希望(双重)检查它。它得到bug修复和其他更新/改进,以确保它与浏览器引擎中的当前实现保持一致。
RestangularProvider.setRequestInterceptor(function(elem, operation) {
  if (operation === "remove") {
     return undefined;
  } 
  return elem;
})