Refus de définir un en-tête dangereux "Origin" lors de l'utilisation de xmlHttpRequest de Google Chrome
Vous avez ce message d'erreur: Refused to set unsafe header "Origin"
En utilisant ce code:
function getResponse() {
document.getElementById("_receivedMsgLabel").innerHTML += "getResponse() called.<br/>";
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
receiveReq.open("GET", "http://L45723:1802", true, "server", "server123"); //must use L45723:1802 at work.
receiveReq.onreadystatechange = handleReceiveMessage;
receiveReq.setRequestHeader("Origin", "http://localhost/");
receiveReq.setRequestHeader("Access-Control-Request-Origin", "http://localhost");
receiveReq.timeout = 0;
var currentDate = new Date();
var sendMessage = JSON.stringify({
SendTimestamp: currentDate,
Message: "Message 1",
Browser: navigator.appName
});
receiveReq.send(sendMessage);
}
}
Qu'est-ce que je fais mal? Que manque-t-il dans l'en-tête pour que cette demande CORS fonctionne?
J'ai essayé de supprimer l'appel receiveReq.setRequestHeader("Origin", ...)
mais ensuite Google Chrome lance une erreur d'accès sur mon appel receiveReq.open()
...
Pourquoi?
C'est juste une supposition, car j'utilise jquery pour les requêtes ajax, y compris CORS.
Je pense que le navigateur est censé définir l'en-tête, pas vous. Si vous pouviez définir l'en-tête, cela irait à l'encontre de l'objectif de la fonction de sécurité.
Essayez la demande sans définir ces en-têtes et voyez si le navigateur les définit pour vous.
Dans CORS, le code appelant n'a à effectuer aucune configuration spéciale. Tout doit être géré par le navigateur. C'est le travail du serveur de décider si la demande doit être autorisée ou non. Donc, chaque fois que vous faites une demande qui rompt SOP politique, le navigateur essaiera de faire une demande CORS pour vous (il ajoutera automatiquement l'en-tête Origin, et fera éventuellement une demande de contrôle en amont si vous êtes en utilisant certains en-têtes/méthodes/types de contenu dangereux). Si le serveur prend en charge CORS, il répondra correctement et autorisera/refusera la demande en fournissant des en-têtes de réponse spécifiques à CORS comme
Access-Control-Allow-Origin: *
Gardez à l'esprit que Chrome est très restrictif sur le nom d'hôte "localhost". (Au moins, c'était quand je travaillais avec lui). Utilisez plutôt le nom de votre ordinateur ou attribuez-lui un autre alias dans "hosts" "Par exemple, n'accédez pas à votre site comme:
http://localhost:port/myappname
Utilisez plutôt:
http://mymachinename:port/myappname
ou
http://mymachinealias:port/myappname
Pour plus de détails, veuillez vérifier spécification .