JAX-RS:No' Access-Control-Allow-Origin'仅使用Restangular客户端

时间:2016-01-09 21:32:13

标签: cors jax-rs restangular

我对特定的CORS相关问题有疑问:在JAX-RS上设置服务器端CORS配置,使其适用于 GET PUT POST ,我没有设法让它与 DELETE 请求一起使用。

我按照herehere的说明设置了JAX-RS请求/响应过滤器:

对于"预检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请求中它是。 DELETE在从curl控制台执行时也能正常工作。

编辑2:

客户端使用 Restangular

编写

1 个答案:

答案 0 :(得分:2)

抱歉,提醒错误。

我发现令人惊讶的是,实际问题在于客户端内部以Restangular编写。

“魔法”解决方案是告诉Restangular在没有正文的情况下发送DELETE请求,如this issue中所述:

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

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