CORS与基本HTTP身份验证

时间:2017-08-16 10:43:24

标签: java jersey cors jax-rs

我在使用CORS进行基本HTTP身份验证时遇到一些问题:我们有一个节点快速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),所以我不知道它为什么不匹配。

我还确保使用HTTP代码200来回答任何预检的OPTIONS请求。

1 个答案:

答案 0 :(得分:1)

根据问题中的描述,听起来像Java Dropwizard(Jersey)服务器正在http://localhost:9000上运行,而节点快速Web服务器(UI)正在另一个来源运行。

无论如何,您必须将Jersey服务器上的Access-Control-Allow-Origin代码中的CORSFilter响应头的值设置为发出请求的前端JavaScript代码的原点(显然是节点服务器)。如果是,例如,http://localhost:12345,那么:

response.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:12345");

无论如何,它必须是http://localhost:9000以外的其他内容,因为如果前端没有办法发出“不允许在http://localhost:9000/… 处读取远程资源的错误消息发送请求的JavaScript代码是从http://localhost:9000提供的 - 因为在这种情况下,它不会是跨源请求,并且您的浏览器不会阻止访问响应。