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 配置,使其正常工作 GET,PUT 和 POST,我无法让它与 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 错误消息。
我有一个关于特定 CORS 相关问题的问题:已在 JAX-RS 上设置服务器端 CORS 配置,使其正常工作 GET,PUT 和 POST,我无法让它与 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 错误消息。