“La croix-Origine de la Demande Bloqué: de La Même Origine que la Politique” d'Erreur dans le navigateur
J'ai eu ce message d'erreur quand j'essaie de POSTER fichier json à mon serveur.
Sur mon serveur, le code est:
@POST
@Path("updatedata")
@Produces("text/plain")
@Consumes("application/json")
public Response UpdateData(String info) {
Gson gson = new Gson();
List<Data> list = gson.fromJson(info, new TypeToken<List<Data>>() {
}.getType());
int is_success = 0;
try {
is_success += trainingdata.updateData(list);
} catch (SQLException e) {
e.printStackTrace();
}
String returnjson = "{\"raw\":\"" + list.size() + "\",\"success\":\"" + is_success + "\"}";
return Response.ok().entity(returnjson).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "POST").build();
}
Je peux mettre à jour mes données avec succès à travers RESTClient - un Plugin Chrome.
Mais quand je construis le frontend et d'essayer d'appeler l'API par le biais de jaascript,
Firefox affiche: Cross-Origin Demande Bloqué: La Même Origine ....
Chrome affiche: XMLHttpRequest ne peut pas charger ... Pas de "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. Origine '...' est donc pas autorisé à accéder
J'ai écrit le javascript comme ceci:
var json = JSON.stringify(array);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://myurl:4080/updatedata", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(json);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
alert('hello');
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
Est-il un problème avec mon code javascript?
Je déploie mon backend code et avant la fin de code dans la même machine.
La fonction GET fonctionne correctement.
@GET
@Produces("application/json")
@Path("/{cat_id}")
public Response getAllDataById(@PathParam("cat_id") String cat_id) {
ReviewedFormat result = null;
try {
result = trainingdata.getAllDataById(cat_id);
Gson gson = new Gson();
Type dataListType = new TypeToken<ReviewedFormat>() {
}.getType();
String jsonString = gson.toJson(result, dataListType);
return Response.ok().entity(jsonString).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET").build();
} catch (SQLException e) {
logger.warn(e.getMessage());
}
return null;
}
Frontale:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://URL:4080/mywebservice/v1/trainingdata/" + cat_id, true);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
//console.log(xhr.responseText);
var jsoninfo = xhr.responseText;
var obj = JSON.parse(jsoninfo);
}
}
}
developer.mozilla.org/en-US/docs/Web/Security/...
OriginalL'auteur Freya Ren | 2014-11-12
Vous devez vous connecter pour publier un commentaire.
De la SCRO empêche de rencontrer des problèmes avec la croix-attaques contre les sites et les forces de développement intelligent en ne comptant pas sur d'autres personnes ressources (ce qui pourrait mourir). Son défaut une fonction de sécurité sur la plupart des serveurs et les navigateurs.
Dans Apache, vous pouvez désactiver la SCRO par l'ajout d'un en-tête, IIS et AppEngine fonctionnent de la même façon.
Puisque vous développer localement, votre meilleur pari est soit XAMPP/WAMPP plus approprié d'en - tête ou tout simplement passer à FireFox.
FireFox ne considère pas les fichiers locaux en vertu de la SCRO, alors que la plupart des navigateurs.
Apache Fixer:
Ajouter un en-tête ->
Réinitialisation du Serveur ->
sudo service apache2 reload
IIS Correctif:
Modifier web.config dans le répertoire racine (similaire à HTAccess)
App Engine:
En-tête de la Méthode pour Python: auto.réponse.les en-têtes.add_header()
Pour Java: resp.addHeader()
Pour Aller: w.L'en-tête().Ajouter()
De la SCRO problèmes peuvent être contournés par JSONP pour les requêtes GET si cela vous intéresse vous: http://en.wikipedia.org/wiki/JSONP
la Plupart du Temps vous ne pouvez utiliser JSONP avec les requêtes GET. Mais vous êtes fondamentalement correcte.
OriginalL'auteur Andrew
C'est un problème causé par une croix de domaine demande en javascript. Le navigateur empêche ce pour des raisons de sécurité.
En javascript, vous ne pouvez pas faire des demandes à un autre domaine (y compris les différentes port) par défaut.
Sont vos options pour activer les catégories de documents ou l'utilisation d'un reverse proxy si vous avez besoin d'envoyer des requêtes à un autre domaine.
Il n'est pas assez si elles sont hébergées sur différents domaines (y compris les différents ports)
Quand vous avez mentionné proxy inverse. Voulez-vous dire par exemple, j'ai créer un fichier PHP pour appeler mon serveur. Et le front de fin d'appeler ce fichier PHP?
Oui, c'est correct. Créer une page sur votre propre nom de domaine qui appelle à son tour l'autre domaine sur le serveur.
Il a juste besoin d'activer la SCRO. Ses pas la science de fusée. Les en-têtes sont la meilleure façon d'aller à ce sujet dans Apache. Machine locale, il suffit de passer à FireFox pour dev. Je suis en train de travailler sur un writeup sur la façon de procéder doit être ci-dessous.
OriginalL'auteur TGH
Il semble que vous avez le contrôle sur la ressource distante que vous publiez. Si c'est le cas, votre ressource distante doit avoir l'en-tête suivant:
Plus d'informations ici (Il ressemble à quelqu'un pose une question comme la tienne déjà): La croix-Origine de la Demande Bloqué: de La Même Origine que la Politique n'autorise pas la lecture de la distance de la ressource
OriginalL'auteur squaretastic
Merci pour @TGH de l'astuce, j'ai fini par résoudre le problème par l'ajout d'un proxy web.
Reportez-vous à À l'aide d'un Proxy Web, j'ai créer un proxy.php fichier, qui reçoivent du Javascript xmlHttpRequest, obtenir le postdata et appeler le service web API.
Et dans le front-end, j'appelle la proxy.php
Je pense que c'est mieux pour déployer le projet sur la télécommande de la boîte, au lieu de modifier la configuration d'Apache.
OriginalL'auteur Freya Ren