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.
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" : {},
}
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 :
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")
}