我在使用带有 CORS 的基本 HTTP 身份验证时遇到一些问题:我们有一个 Node Express Web 服务器 (UI),从运行在同一主机上的 Java Dropwizard (Jersey) 服务器调用 HTTP API。
API 受到 HTTP 基本身份验证的保护,我在 Jersey 服务器上实现了以下过滤器(摘自这篇文章:How to handle CORS using JAX-RS with Jersey):
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:9000");
response.getHeaders().add("Access-Control-Allow-Headers",
"Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
但是,当我尝试加载 Web UI 时,我的控制台会提供以下输出:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:9000/intraday/parameters. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘http://localhost:9000’)
我无法理解这个错误。显然,原点是相同的( http://localhost:9000 ),所以我不明白为什么它不匹配。
我还确保任何预检的 OPTIONS 请求都使用 HTTP 代码 200 进行应答。
最佳答案
从问题的描述来看,听起来 Java Dropwizard (Jersey) 服务器正在 http://localhost:9000
上运行,而 Node Express Web 服务器 (UI) 正在另一个运行起源。
无论如何,您必须将 Jersey 服务器上的 CORSFilter
代码中的 Access-Control-Allow-Origin
响应 header 的值设置为前端 JavaScript 的来源发出请求的代码(显然是节点服务器)。因此,如果是 http://localhost:12345
,那么:
response.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:12345");
它无论如何都必须是 http://localhost:9000
以外的内容,因为您的浏览器不可能发出“禁止读取 http://localhost:/”处的远程资源的信息。/localhost:9000/...
” 如果发送请求的前端 JavaScript 代码是由 http://localhost:9000
提供服务的,则会出现错误消息 - 因为在该情况下在这种情况下,它不会是跨源请求,并且您的浏览器不会阻止对响应的访问。
关于java - 具有基本 HTTP 身份验证的 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711404/