CORS header 'Access-Control-Allow-Origin' 不匹配...但确实匹配‼

新手上路,请多包涵

我正在用 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();
    }
}

我想使用用户脚本将其加载到 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”不匹配)。

即使在控制台中,我也可以清楚地看到该错误具有误导性:

图片说明

如果我不讨厌 CORS,我现在就会开始讨厌它了。你能告诉我允许来源标头中的实际字符串是什么吗?

原文由 Tomáš Zato 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 553
2 个回答

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

所以在上面,做:

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

原文由 zeroimpl 发布,翻译遵循 CC BY-SA 4.0 许可协议

我为同样的问题苦苦挣扎了几个小时,发现我在 origin 的末尾添加了一个正斜杠 : https://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());

原文由 Steve Brush 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题