【发布时间】:2021-05-28 00:00:57
【问题描述】:
我正在使用 Jersey2 响应过滤器来处理来自浏览器的 CORS 请求。在这一点上,它看起来很像 Paul Samsotha 在这个问题中的那个 How to handle CORS using JAX-RS with Jersey
@Provider
public class CORSFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext)
throws IOException {
if (containerRequestContext.getHeaderString("Origin") == null) {
return;
}
if (isPreflightRequest(containerRequestContext)) {
containerResponseContext.getHeaders()
.add("Access-Control-Allow-Credentials", "true");
containerResponseContext.getHeaders()
.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
containerResponseContext.getHeaders()
.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
containerResponseContext.getHeaders()
.add("Access-Control-Allow-Origin", "*");
}
@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
if (isPreflightRequest(containerRequestContext)) {
containerRequestContext.abortWith(Response.ok().build());
return;
}
}
private static boolean isPreflightRequest(ContainerRequestContext request) {
return request.getHeaderString("Origin") != null
&& request.getMethod().equalsIgnoreCase("OPTIONS");
}
}
现在一切正常,直到我像这样在前端添加自己的标头(用于授权目的)
axios.defaults.headers.common["xy"] = "example content";
在服务器端我有一个简单的DELETE方法作为例子
@Path("/example")
@DELETE
public void example(@Context HttpHeaders headers) {
String headerContent = headers.getHeaderString("xy");
...do stuff...
}
添加此标头后,不再为主调用执行过滤器。它仍然为预检执行,但不再为 DELETE 调用执行,这会在浏览器中触发 CORS-Error。
从 Postman 测试它在完全相同的标题下工作得非常好。我拨打电话,过滤器触发,一切正常。但是在浏览器运行的那一刻,过滤器就不再被触发了。
我也对 PUT 进行了测试,结果相同。我已经用 vanilla JS XMLHTTPRequest 对其进行了测试,结果相同。通过远程调试我知道过滤器根本没有执行。当我删除标题时,我仍然有 OPTIONS 和 DELETE 调用,但过滤器对这两个调用都执行。当我再次添加标头时,它只对 OPTIONS 调用(没有标头)执行,而不是对 DELETE 调用。
这在 Tomcat 9 上运行,带有 Jersey 2.27 和 Java 11。
所以我的问题是,为什么标头似乎会杀死过滤器的执行?
【问题讨论】:
-
会不会是 XMLHTTPRequest 没有发送
Origin标头?
标签: java cors jersey jax-rs jersey-2.0