web-dev-qa-db-ja.com

クロスオリジンリクエストがブロックされました

だから、POSTコンテンツをデータストアに保存し、それに応じて他の情報を取得するGo HTTPハンドラーがあります。バックエンドでは次を使用します。

func handleMessageQueue(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    if r.Method == "POST" {

        c := appengine.NewContext(r)

        body, _ := ioutil.ReadAll(r.Body)

        auth := string(body[:])
        r.Body.Close()
        q := datastore.NewQuery("Message").Order("-Date")

        var msg []Message
        key, err := q.GetAll(c, &msg)

        if err != nil {
            c.Errorf("fetching msg: %v", err)
            return
        }

        w.Header().Set("Content-Type", "application/json")
        jsonMsg, err := json.Marshal(msg)
        msgstr := string(jsonMsg)
        fmt.Fprint(w, msgstr)
        return
    }
}

私のfirefox OSアプリでは次を使用します。

var message = "content";

request = new XMLHttpRequest();
request.open('POST', 'http://localhost:8080/msgs', true);

request.onload = function () {
    if (request.status >= 200 && request.status < 400) {
        // Success!
        data = JSON.parse(request.responseText);
        console.log(data);
    } else {
        // We reached our target server, but it returned an error
        console.log("server error");
    }
};

request.onerror = function () {
    // There was a connection error of some sort
    console.log("connection error");
};

request.send(message);

着信部分はすべて一緒に動作します。しかし、私の応答はブロックされています。次のメッセージを送ってください:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.

私は他の多くのことを試しましたが、サーバーからの応答を取得する方法はありません。しかし、Go POSTメソッドをGETに変更し、ブラウザーからページにアクセスすると、非常に悪いデータが得られます。どちらの側が間違っているのか、そしてなぜ: Goはこれらの種類のリクエストをブロックするべきではないかもしれませんが、私のjavascriptは違法であるかもしれません。

21
Dani

@ Egidius、XMLHttpRequestを作成するときに使用する必要があります

var xhr = new XMLHttpRequest({mozSystem: true});

mozSystemとは?

mozSystemブール値:このフラグをtrueに設定すると、サーバーがCORSを使用してオプトインする必要なく、クロスサイト接続を確立できます。 mozAnon:trueを設定する必要があります。つまり、これをCookieまたは他のユーザー資格情報の送信と組み合わせることはできません。これは、特権(レビュー済み)アプリでのみ機能します。 Firefoxにロードされた任意のWebページでは機能しません。

マニフェストの変更

マニフェストで、権限に次の行を含めることを忘れないでください。

"permissions": {
       "systemXHR" : {},
}
21
msaad

Access-control-allow-Originだけでなく、他のヘッダーも必要です。リクエストに「Access-Control-Allow-Origin」ヘッダーがある場合は、レスポンスヘッダーにコピーする必要があります。ない場合は、「Origin」ヘッダーを確認してレスポンスにコピーする必要があります。要求にOriginヘッダーではなくAccess-Control-Allow-Originヘッダーがない場合は、「*」を返す必要があります。

ここで完全な説明を読むことができます: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

そして、これはクロスドメインヘッダーを書くために使用している関数です:

func writeCrossDomainHeaders(w http.ResponseWriter, req *http.Request) {
    // Cross domain headers
    if acrh, ok := req.Header["Access-Control-Request-Headers"]; ok {
        w.Header().Set("Access-Control-Allow-Headers", acrh[0])
    }
    w.Header().Set("Access-Control-Allow-Credentials", "True")
    if acao, ok := req.Header["Access-Control-Allow-Origin"]; ok {
        w.Header().Set("Access-Control-Allow-Origin", acao[0])
    } else {
        if _, oko := req.Header["Origin"]; oko {
            w.Header().Set("Access-Control-Allow-Origin", req.Header["Origin"][0])
        } else {
            w.Header().Set("Access-Control-Allow-Origin", "*")
        }
    }
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
    w.Header().Set("Connection", "Close")

}
2
Karl

このコードをapplication.rbに配置する必要があります

config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
0
sivamani