Demande D'Origine Croisée Bloquée

J'ai donc ce gestionnaire Go http qui stocke du contenu POST dans le datastore et récupère d'autres informations en réponse. Sur la fin, j'utilise:

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
    }
}

dans mon application firefox OS j'utilise:

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);

la partie entrante fonctionne et ainsi de suite. Cependant, ma réponse est bloqué. Me donnant le message suivant:

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.

j'ai essayé beaucoup d'autres choses, mais il n'y a aucun moyen que je peux obtenir une réponse du serveur. Cependant, quand je changer ma méthode Go POST dans GET et accéder à la page à travers le navigateur je reçois les données que je veux tellement mauvais. Je ne peux pas vraiment décider quel côté va mal et pourquoi: il se peut que Go ne devrait pas bloquer ce genre de requêtes, mais il se peut aussi que mon javascript soit illégal.

20
demandé sur Dani 2014-03-13 00:38:10

3 réponses

@Egidius, lors de la création D'une XMLHttpRequest, vous devez utiliser

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

qu'est-ce que mozSystem?

booléen mozSystem: mettre ce drapeau à true permet de faire des connexions intersite sans exiger du serveur d'opt-in en utilisant CORS. Nécessite la configuration de mozAnon: true, c'est-à-dire que cela ne peut pas être combiné avec l'envoi de cookies ou d'autres informations d'identification de l'utilisateur. Cela ne fonctionne que dans les applications privilégiées (révisées); cela ne fonctionne pas sur les pages Web arbitraires chargées dans Firefox.

Modifications à votre Manifeste

Sur le manifeste, n'oubliez pas d'inclure cette ligne sur vos autorisations:

"permissions": {
       "systemXHR" : {},
}
19
répondu msaad 2015-08-18 16:45:46
ERROR : Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at the url. This can be fixed by moving the resource to the same domain or enabling CORS.

Solution:

j'ai trouvé la solution demande d'origine croisée en caractères gras "résolu"

si vous travaillez sur un projet web et que vous souhaitez obtenir des données à partir de différents site , Parfois vous obtenez un tel type d'erreur ensuite, vous devez utiliser htaccess fichier dans le dossier racine du desservant le serveur (pas le serveur de réception)

code de mise à jour

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>  

si vous êtes un développeur wordpress puis mise à jour code suivant :

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

# END WordPress 

merci :) heureux de codage :

9
répondu indian 2016-01-13 16:19:38

Vous avez besoin d'autres en-têtes, pas seulement access-control-allow-origin. Si votre requête a l'en-tête" Access-Control-Allow-Origin", vous devez la Copier dans les en-têtes de réponse, sinon, vous devez cocher l'en-tête" Origin " et la Copier dans la réponse. Si votre requête n'a pas D'en-têtes Access-Control-Allow-Origin not Origin, vous devez retourner "*".

Vous pouvez lire l'explication complète ici: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

et c'est la fonction que j'utilise pour écrire de la croix-domaine d'en-tête:

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
répondu Karl 2014-03-13 03:03:01