CORS标题' Access-Control-Allow-Origin'不匹配......但确实如此!

时间:2016-02-09 22:43:15

标签: javascript http-headers cors firebug

我在Java中制作了一个非常简单的JSON API。它实际上是一个提供物体坐标的Project Zomboid mod。这就是我的HTTP处理程序的样子:

public class JSONZomboid implements HttpHandler
{
    @Override
    public void handle(HttpExchange t) throws IOException {
        // HEADERS
        Headers headers = t.getResponseHeaders();
        headers.set("Content-Type", "text/json");   
        headers.set("Access-Control-Allow-Origin", "pzmap.crash-override.net");                 
        t.sendResponseHeaders(200,0);
        //BODY
        OutputStream os = t.getResponseBody();
        os.write("{\n".getBytes());
          // generate JSON here
        os.write("}".getBytes());
        os.close();
    }
}

我想使用userscript将它加载到Project Zomboid地图项目中,这意味着我需要启用CORS才能连接。这是通过简单的代码完成的:

PlayerRenderer.prototype.fetchInfo = function() {
  $.get("http://127.0.0.1:8000/test", {}, this.displayPoints.bind(this));
}

但是我收到了这个错误:

  

警告:阻止跨源请求:同源策略禁止在http://127.0.0.1:8000/test读取远程资源。 (原因:CORS标题' Access-Control-Allow-Origin'不匹配' pzmap.crash-override.net')。

即使在控制台中,我也能清楚地看到错误是误导性的:

image description

如果我不讨厌CORS,我现在就开始讨厌它了。你能否告诉我allow origin header中的实际字符串是什么?

3 个答案:

答案 0 :(得分:2)

上面的评论#1是正确的:CORS需要Access-Control-Allow-Origin标头与客户端的原始请求相匹配(用于端到端SSL体验)。因此,在这种情况下,请确保在Access-Control-Allow-Origin标头中设置pzmap.crash-override.net。

两个注释:

1-尽管您可以在线阅读,但nginx目前需要将多个条目列为单独的行,a la:                 add_header Access-Control-Allow-Origin“https://developers.google.com”;                 add_header Access-Control-Allow-Origin“https://imasdk.googleapis.com”;

2 - 尽管您可以在线阅读,但使用通配符并不合适。并非所有客户(意味着浏览器)都允许它。

答案 1 :(得分:1)

实际问题是Access-Control-Allow-Origin标头应该包含协议,而不仅仅是主机名。如果Web浏览器只是将此部分包含在错误消息中,那就更好了。

所以在上面,做:

headers.set("Access-Control-Allow-Origin", "http://pzmap.crash-override.net");  

答案 2 :(得分:0)

我在几个小时内遇到了同样的问题,发现我在originhttps://foo.com/的末尾加了一个正斜杠,应该是https://foo.com。 (谈论一个重要的面孔时刻!)

我的(现在正在工作)Express Node.JS设置:

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors({
  methods: 'GET,POST,PATCH,DELETE,OPTIONS',
  optionsSuccessStatus: 200,
  origin: 'https://foo.com'
}));
app.options('*', cors());