IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] uncaught exception: Access to restricted URI denied (NS_ERROR_DOM_BAD_URI)


Sujet :

AJAX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut [AJAX] uncaught exception: Access to restricted URI denied (NS_ERROR_DOM_BAD_URI)
    Bonjour,
    je debute en Ajax et je suis en tarin d'essayer de lancer une requete classique en Ajax
    pour commencer j'ai fais ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr"
    	lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script language="JavaScript">
    	function submitForm()
    	{ 
    		var req = null; 
     
    		document.ajax.dyn.value="Started...";
    		if(window.XMLHttpRequest)
    			req = new XMLHttpRequest(); 
    		else if (window.ActiveXObject)
    			req  = new ActiveXObject(Microsoft.XMLHTTP); 
     
    		req.onreadystatechange = function()
    		{ 
    			document.ajax.dyn.value="Wait server...";
    			if(req.readyState == 4)
    			{
    				if(req.status == 200)
    				{
    					var doc = req.responseXML;                                    //  Assigner le fichier XML à une variable
    					var element = doc.getElementsByTagName('parcours').item(0);  //  Lire le premier élément avec DOM
    					document.ajax.dyn.value= element.getAttribute("id");    
     
    				}	
    				else	
    				{
    					document.ajax.dyn.value="Error: returned status code " + req.status + " " + req.statusText;
    				}	
    			} 
     
    		}; 
    		req.open("GET", "diplomes.xml", true); 
    		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    		req.send(null); 
    	} 
    	</script>
    </head>
     
    <body>
    <FORM name="ajax" method="POST" action="">
     
    <p><INPUT type="BUTTON" value="Submit" ONCLICK="submitForm()">
    </p>
    <p><input type="text" name="dyn" size="32" value=""></p>
    </FORM>
    </body>
    </html>
    ceci marche tres bien puisque j'ai un fichier diplomes.xml au meme niveau que mon fichier html

    Apres je voulais faire la meme chose en cherchant le fichier sur un autre serveur comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr"
    	lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script language="JavaScript">
    	function submitForm()
    	{ 
    		var req = null; 
     
    		document.ajax.dyn.value="Started...";
    		if(window.XMLHttpRequest)
    			req = new XMLHttpRequest(); 
    		else if (window.ActiveXObject)
    			req  = new ActiveXObject(Microsoft.XMLHTTP); 
     
    		req.onreadystatechange = function()
    		{ 
    			document.ajax.dyn.value="Wait server...";
    			if(req.readyState == 4)
    			{
    				if(req.status == 200)
    				{
    					var doc = req.responseXML;                                    //  Assigner le fichier XML à une variable
    					var element = doc.getElementsByTagName('parcours').item(0);  //  Lire le premier élément avec DOM
    					document.ajax.dyn.value= element.getAttribute("id");    
     
    				}	
    				else	
    				{
    					document.ajax.dyn.value="Error: returned status code " + req.status + " " + req.statusText;
    				}	
    			} 
     
    		}; 
    		req.open("GET", "http://127.0.0.1:8081/TestApplication/diplomes.xml", true); 
    		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    		req.send(null); 
    	} 
    	</script>
    </head>
     
    <body>
    <FORM name="ajax" method="POST" action="">
     
    <p><INPUT type="BUTTON" value="Submit" ONCLICK="submitForm()">
    </p>
    <p><input type="text" name="dyn" size="32" value=""></p>
    </FORM>
    </body>
    </html>
    mais ce code declance une erreur javascript : uncaught exception: Access to restricted URI denied (NS_ERROR_DOM_BAD_URI)

    Est ce que quelqu'un peut me dire pourquoi je ne peux pas chercher ce fichier sur un autre serveur sachant que si je tape l'url http://127.0.0.1:8081/TestApplication/diplomes.xml alors elle reponds bien.

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    C'est la Same Origin Policy qui empêche de lancer des requêtes en dehors du domaine.
    Une solution de contournement est présente dans les tutoriels.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Bovino Voir le message
    C'est la Same Origin Policy qui empêche de lancer des requêtes en dehors du domaine.
    Une solution de contournement est présente dans les tutoriels.
    Merci pour la réponse.
    je l'ai deja vu cette solution mais je n'ai rien compris.
    est ce que vous pouvez me dire comment l'adapter à mon exemple.
    Merci d'avance.

  4. #4
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Bien le bonjour,

    Les solutions de contournement ne sont pas forcément des plus simples à mettre en œuvre et elles demandent des changements dans ta manière de récupérer l'information : tu dois changer la requête de la donnée (l'appel à l'objet XMLHttpRequest va être chamboulé) et tu dois aussi changer les données publiées sur le serveur : ça ne sera plus un simple fichier xml mais un code JavaScript qui contiendra tes données.

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Au pire, tu peux appeler via Ajax un script coté serveur (en PHP par exemple) qui lui fera une requête vers le domaine externe et renverra le XML vers le client.

  6. #6
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    JSONP est effectivement la solution la plus simple
    Si tu reprends le tutoriel, tu comprends que la démarche est celle-ci:

    1) Tu remplaces l'appel AJAX par la création à la volée d'une balise SCRIPT qui elle peut faire un chargement cross-domain. Autrement dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://127.0.0.1:8081/TestApplication/xxxxxx.yyy"></script>
    est autorisé.

    Ce code en est l'exemple de création:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //fonction extraite du tutoriel
    function callExternalScript(url){
        var n = document.createElement("script");
        n.setAttribute("type", "text/javascript");
        n.setAttribute("src", url);
        document.getElementsByTagName("head")[0].appendChild(n);
    }
    2) L'idée de JSONP (le P pour PADDING, on comble par des données JSON reçues) est que ton script que tu télécharges depuis le server (par exemple searchDatas.php?id=123) en profite pour effectuer le traitement souhaité et en retour fournit du code javascript; finalement il provoque l'exécution d'une fonction javascript déterminée (qui existe déjà côté client - ou pas si le script la fournit aussi, mais plus rare car grosse faille de sécurité). Et cette fonction appelée prend comme paramètre une structure JSON qui donne le cas échéant les données extraite depuis le server.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    //données extraites du tutoriel
    traiteLesDonnees({
        "developpez",
    	[["developpez.net","1 290 000 résultats","2"],
    	["developpez .com","1 320 000 résultats","3"],
    	["developpez forum","4 040 000 résultats","4"],
    	["developpez java","1 430 000 résultats","5"],
    	["developpez php","4 790 000 résultats","6"],
    	["developpez.com forum","426 000 résultats","7"],
    	["developpez sql","1 300 000 résultats","8"],
    	["developpez.fr","71 résultats","9"],
    	["developpez javascript","1 140 000 résultats","10"],
    	["développer photo","1 980 000 résultats","11"]]
        }
    );
    J'espère que c'est plus clair pour toi,

    ERE

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    J'espère que c'est plus clair pour toi,

    ERE
    pas vraiment

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    en fait je voulais vous preciser autre chose.
    le fichier auxuel je veux acceder se trouve dans le meme domaine que mon client.
    Mon serveur ne peut pas y acceder c pourquoi je voulais faire une requete en ajax.

  9. #9
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par ensisoft Voir le message
    en fait je voulais vous preciser autre chose.
    le fichier auxuel je veux acceder se trouve dans le meme domaine que mon client.
    Appelons ton domaine domaine.com. Tous les fichiers mis en jeu appartiennent à ce domaine domaine.com ? Si c'est le cas il ne doit y avoir aucun souci particulier .

    Mon serveur ne peut pas y acceder c pourquoi je voulais faire une requete en ajax.
    Que veux tu dire par "accéder" ? C'est le server qui fait une requête pour accéder au fichier ? Ou c'est juste la notion de "renvoyer" ?

    Tu peux réexpliquer stp, en donnant précisément où sont placés les différents fichiers et scripts ? Parce que là il y a quelque chose qui ne tourne pas rond et j'ai l'impression qu'on passe à côté d'un truc énorme.



    ERE

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    en fait c'est une application Web avec un serveur S et des clients C qui accedent au serveur via internet.
    chaque poste client est situé dans un reseau local .
    j'ai prevu que les client accedent à des machines M dans leur reseau local
    ceci veut dire que les Client C peuvent acceder au machine M mais pas le serveur S.
    C'est pourquoi j'ai pensé à AJAX puisque c'est le client qui va acceder a la machine M et non le serveur.
    Est ce plus clair ?

  11. #11
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par ensisoft Voir le message
    en fait c'est une application Web avec un serveur S et des clients C qui accedent au serveur via internet.
    donc C accède à S ?

    chaque poste client est situé dans un reseau local .
    j'ai prevu que les client accedent à des machines M dans leur reseau local
    ceci veut dire que les Client C peuvent acceder au machine M mais pas le serveur S.
    donc C peut accéder à M mais S ne le peut pas ?
    Qu'est ce que M ? Un server web sur le réseau ?

    C'est pourquoi j'ai pensé à AJAX puisque c'est le client qui va acceder a la machine M et non le serveur.
    Donc si je comprends tout, C affiche une page issue de S et lance à partir de cette page une requête Ajax sur M ?


    ERE

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    donc C accède à S ?

    Oui

    donc C peut accéder à M mais S ne le peut pas ?
    Oui
    Qu'est ce que M ? Un server web sur le réseau ?
    Oui


    Donc si je comprends tout, C affiche une page issue de S et lance à partir de cette page une requête Ajax sur M ?
    Oui


    ERE

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    et puisque S et M ne sont pas sur le meme domaine ça ne passe pas.

  14. #14
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par ensisoft Voir le message
    et puisque S et M ne sont pas sur le meme domaine ça ne passe pas.
    Ok, les choses sont parfaitement claires et la seule solution qui ne réduit pas la sécurité du navigateur réside dans le tutoriel proposé précédemment, dont j'ai essayé de te retranscrire la démarche précédemment.

    ERE

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    Comme j'arrive pas à le comprendre est ce que tu peux me dire comment adapter le tutorial à mon contexte.
    Merci d'avance.

  16. #16
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par ensisoft Voir le message
    Comme j'arrive pas à le comprendre est ce que tu peux me dire comment adapter le tutorial à mon contexte.
    Merci d'avance.

    Veux tu juste faire cela une fois récupérée ta donnée XML (extrait de ton code Ajax) ?
    var element = doc.getElementsByTagName('parcours').item(0); // Lire le premier élément avec DOM
    document.ajax.dyn.value= element.getAttribute("id");

    ERE

  17. #17
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    en fait mon code devient comme ça maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <!-- saved from url=(0069)http://khayyam.developpez.com/articles/web/ajax-cross-domain/suggest/ -->
    <HTML><HEAD>
    <META http-equiv=Content-Type content="text/html; charset=unicode">
    <META content="MSHTML 6.00.6000.16825" name=GENERATOR></HEAD>
    <BODY
    <SCRIPT>
     
    // A completer
     
     
    function call_suggest(e){
     
             var s = document.createElement("script");
     
             s.setAttribute("type", "text/javascript");
     
             s.setAttribute("src", "http://127.0.0.1:8081/TestApplication/test.xml");
     
             document.getElementsByTagName("head")[0].appendChild(s);
     
    }
     
    </SCRIPT>
    <BR><BR><INPUT onkeypress=call_suggest(this.value) id=f> 
    <DIV id=s>
    <SCRIPT> var s = document.getElementById("s");</SCRIPT>
    </DIV></BODY></HTML>
    il me reste juste comment recuperer les donnée de mon fichier xml

  18. #18
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Cette url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     s.setAttribute("src", "http://127.0.0.1:8081/TestApplication/test.xml");
    doit renvoyer un script javascript. Donc cible plutôt une url type PHP (appelons là getXML.php).

    Dans le source de getXML.php tu charges ton fichier XML et tu le renvoies sous la forme d'une chaine de caractere JS. Tu appelles dans ce même script une fonction (disons traiteXML ) à laquelle tu passe la chaine XML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var xmlStr = "<?php .... ?>";
    traiteXML(xmlStr);
    Cette fonction traiteXML est à implanter dans ton code côté client et c'est elle qui va pouvoir travailler avec tes données XML qui auront ainsi été transmises.

    ERE

  19. #19
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    Par défaut
    ok j'ai compris Merci.
    J'ai une autre question :
    j'ai lu dans un document qu'on peut faire du Ajax classique XMLHttpRequest sur plusieurs domaines mais il faut configurer les navigateur client pour qu'ils acceptent ça (ajouter en tant que site de confiance et d'autres config...).
    t'as une idée sur ça ?
    Merci d'avance.

  20. #20
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Cela est très dangereux car tu t'exposes à de grosses failles de sécurité.

    Par exemple pour IE il faut ajouter le site qui héberge le code AJAX (le site S) dans les sites de confiance. Ensuite cela peux dépendre des versions de MSXML. Bref beaucoup de risques pour pas grand chose alors qu'il existe la solution Javascript.

    ERE

Discussions similaires

  1. Error : Access to restricted URI denied
    Par francky74 dans le forum AngularJS
    Réponses: 2
    Dernier message: 25/12/2016, 21h50
  2. Réponses: 2
    Dernier message: 04/06/2009, 19h56
  3. Réponses: 2
    Dernier message: 18/05/2009, 14h36
  4. Réponses: 1
    Dernier message: 14/08/2008, 16h06
  5. Chemin d'accès, uncaught exception
    Par maximenet dans le forum Zend Framework
    Réponses: 12
    Dernier message: 26/07/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo