簡體   English   中英

CORS標題'Access-Control-Allow-Origin'不匹配......但確實如此!

[英]CORS header 'Access-Control-Allow-Origin' does not match… but it does‼

我在Java中創建了一個非常簡單的JSON API。 它實際上是一個項目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'不匹配)。

即使在控制台中我也能清楚地看到錯誤是誤導性的:

圖片描述

如果我還沒有討厭CORS,我現在就開始討厭它了。 你能否告訴我allow origin header中的實際字符串是什么?

上面的注釋#1是正確的:CORS需要Access-Control-Allow-Origin標頭與客戶端的原始請求相匹配(對於端到端SSL體驗)。 因此,在這種情況下,請確保在Access-Control-Allow-Origin標頭中設置pzmap.crash-override.net。

兩個筆記:

1-盡管您可以在線閱讀,但nginx目前需要將多個條目列為單獨的行,la:add_header Access-Control-Allow-Origin“ https://developers.google.com ”; add_header Access-Control-Allow-Origin“ https://imasdk.googleapis.com ”;

2 - 盡管您可以在線閱讀,但使用通配符並不合適。 並非所有客戶端(意味着瀏覽器)都允許它。

實際問題是Access-Control-Allow-Origin標頭應該包含協議,而不僅僅是主機名。 如果Web瀏覽器只是將此部分包含在錯誤消息中,那將會好得多。

所以在上面,做:

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

幾個小時我一直在努力解決這個問題,並發現我在origin的末尾加了一個正斜杠: https://foo.com/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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM