我在使用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请求。
答案 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
提供的 - 因为在这种情况下,它不会是跨源请求,并且您的浏览器不会阻止访问响应。