我对特定的CORS相关问题有疑问:在JAX-RS上设置服务器端CORS配置,使其适用于 GET , PUT 和 POST ,我没有设法让它与 DELETE 请求一起使用。
我按照here和here的说明设置了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 。
编写答案 0 :(得分:2)
抱歉,提醒错误。
我发现令人惊讶的是,实际问题在于客户端内部以Restangular编写。
“魔法”解决方案是告诉Restangular在没有正文的情况下发送DELETE请求,如this issue中所述:
RestangularProvider.setRequestInterceptor(function(elem, operation) {
if (operation === "remove") {
return undefined;
}
return elem;
})
否则,DELETE请求会触发400错误,我怀疑浏览器错误地将其解释为CORS错误,从而在控制台中输出与CORS相关的错误消息。