java - 具有基本 HTTP 身份验证的 CORS

标签 java jersey cors jax-rs

我在使用带有 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/

相关文章:

java - FXML如何设置选择框默认值

java - 使用 jersey 客户端编写 POST 请求

jquery - 是否可以对 application/json 进行跨域 POST ajax 请求?

http-headers - 没有值的 CORS header

java - 识别 HashSet 中的重复项

java - Spring依赖注入(inject)对象池

java - Java中删除子字符串

java - 如何以多部分形式发送响应

java - WAR 文件部署到 Tomcat 失败 : URI scheme error

asp.net - 被 CORS 政策阻止 : Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response