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

JavaScript Discussion :

Ping Blocage d’une requête multi-origines (Cross-Origin Request)


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut Ping Blocage d’une requête multi-origines (Cross-Origin Request)
    Bonjour,

    Je souhaite afficher une image si une instance serveur est up ou down

    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
    function setserveron(url_test, id) {
     
    	ping = new XMLHttpRequest();    
    	ping.onreadystatechange = function(){
    	//alert('stat =' + ping.status);
        if(ping.readyState == 4){
            if(ping.status == 200){
                document.getElementById(id).innerHTML = 'TOP'+ping.status+'<img height=20px src="up.png" alt="" title="" /> ';
            } else {
    			document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    		}
        } else {
    		document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    	}
     
    }
     
     
    ping.open("GET", url_test, true); 
    ping.send();
     
     
    }

    La fonction et son appel fonctionnent correctement.
    Quand l'instance est down cela fonctionne bien, résultat attendu.

    Par contre quand l'instance est up j'ai le message :
    Blocage d’une requête multi-origines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http/monserveur:4343. Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant.
    Je ne peux pas modifier les cibles.
    Je me dis que si je détecte ce message alors je peux indiquer que l'instance est UP car elle arrive bien jusqu'au serveur qui la refuse.

    Mais comment capter ce message d'avertissement ?

    Un try/catch ne fonctionne pas.

    Merci de vos idées.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    J'ai amélioré ma fonction, cepandant maintenant tout est vert y compris quand l'instance est down....

    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
     
    <script type="text/javascript">
    function setserveron(url_test, id) {
     
    	ping = new XMLHttpRequest();
    	ping.onerror = function(msg) { 
    		alert("Not Connected : "+msg.target.withCredentials); 
    		if(msg.target.withCredentials == false) {
    			document.getElementById(id).innerHTML = 'TOP'+ping.status+'<img height=20px src="up.png" alt="" title="" /> ';
    		}
    	}    
    	ping.onreadystatechange = function(){
    	//alert('stat =' + ping.status);
        if(ping.readyState == 4){
            if(ping.status == 200){
                document.getElementById(id).innerHTML = 'TOP'+ping.status+'<img height=20px src="up.png" alt="" title="" /> ';
            } else {
    			document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    		}
        } else {
    		document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    	}
     
    }
     
    ping.open("GET", url_test, true); 
    ping.send();
     
    }
    </script>

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Si tu as le contrôle sur le serveur tu peux lui faire envoyer un entête Access-Control-Allow-Origin pour te permettre de faire une requête ajax cross-origin. Il n’y a rien à rajouter côté client.

    Quand une requête est bloquée par la same-origin policy, l’objet XMLHttpRequest a son status égal à 0 et son statusText à "" (la chaîne vide). Tu peux te servir de ça pour détecter un blocage. La valeur de readyState n’est pas significative dans le cas d’un blocage.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    j'ai tenté cela mais sans succès :

    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
     
    function setserveron(url_test, id) {
     
    	ping = new XMLHttpRequest();
     
    	ping.onreadystatechange = function(){
    	//alert('stat =' + ping.status);
        if(ping.readyState == 4){
            if(ping.status == 200){
                document.getElementById(id).innerHTML = 'TOP'+ping.status+'<img height=20px src="up.png" alt="" title="" /> ';
            } else {
    			document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    		}
        } else if(ping.status == 0 && ping.statusText == "") {
    		document.getElementById(id).innerHTML = 'TOP'+ping.status+'<img height=20px src="up.png" alt="" title="" /> ';
        } else {
    		document.getElementById(id).innerHTML = 'FLOP'+ping.status+'<img height=20px src="remove.png" alt="" title="" />';
    	}
     
    }
     
    ping.open("GET", url_test, true); 
    ping.send();
     
    }

  5. #5
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Toutes mes excuses, je t’ai mal renseigné.

    Je viens de faire quelques tests, et apparemment il est impossible de faire la différence entre une erreur de connexion et une requête bloquée. Du coup je me demande comment tu arrivais à détecter que le serveur était indisponible.
    La fonction et son appel fonctionnent correctement.
    Quand l'instance est down cela fonctionne bien, résultat attendu.
    Peux-tu détailler ce passage ?

    Note, tu peux tester la présence d’images sur le serveur distant. Les requêtes d’images ne sont pas soumises à la same-origin policy. Une image dont l’adresse est prévisible est la favicon. Si tu peux avoir l’information à l’avance qu’une favicon est présente sur le serveur, ou toute autre image à une adresse prévisible, tu pourras te servir de ce squelette de code pour un test suffisamment fiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var $img = document.createElement('img');
     
    $img.onerror = function () {
      console.log('%cerror', 'color: red');
    };
     
    $img.onload = function () {
      console.log('%csuccess', 'color: lime');
    };
     
    $img.src = serverName + '/favicon.ico';
    Avec cette technique, les ressources autres que des images (dont les pages html) sont considérées comme une erreur, et encore une fois il est impossible de faire la différence entre une ressource inaccessible ou simplement une ressource dont le type ne correspond pas.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Alors effectivement je n'avais pas trop décrit, et en décrivant plus, je me suis aperçu d'une séquence que je n'explique pas.

    Je réalise 3 appels de la fonction "setserveron" sur une instance KO et deux instances OK afin de vérifier les 2 états (UP ou DOWN).
    Code html : 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
    <td  align="center"> 
    <p id="dynamique1"><script language="javascript" type="text/javascript">
    <!--
      setserveron('http://url1.com:8003', 'instance1');
      //-->
     </script></p> </td>
     <td  align="center"> 
     <p id="dynamique2"><script language="javascript" type="text/javascript">
    <!--
            setserveron('http://url2.com:50120',  'instance2')
     //-->
     </script></p> </td>
     <td  align="center"> 
     <p id="dynamique3"><script language="javascript" type="text/javascript">
    <!--
            setserveron('http://url2.com:8001', 'instance3')
      //-->
     </script></p></td> 
     <td  align='center'>

    Et en me mettant en debug je vois les appels suivants dans la fonction setservon :

    1 : http://url1.com:8003
    ping.readyState <> 4
    ping.status == 0 && ping.statusText == ""
    Résultat = TOP, alors que l'instance est DOWN

    2 : http://url2.com:50120
    ping.readyState <> 4
    ping.status == 0 && ping.statusText == ""
    Résultat = TOP, et l'instance est bien UP

    3 : http://url2.com:8001
    ping.readyState <> 4
    ping.status == 0 && ping.statusText == ""
    Résultat = TOP, et l'instance est bien UP

    4 : http://url2.com:8001
    ping.readyState <> 4
    ping.status == 0 && ping.statusText == ""
    Résultat = TOP, et l'instance est bien UP

    5 : http://url2.com:8001
    ping.readyState == 4
    ping.status <> 200
    Résultat = FLOP, alors que l'instance est bien UP

    Résultat final : 1 OK (alors que DOWN), 2 OK (bien UP), 3 KO (alors que UP).
    Je ne comprend pas les 5 appels, je ne comprend pas les passages/conditions associés....

    Je me disais que je pouvais identifier la différence car je ne vois que 2 messages dans la console :
    Blocage d’une requête multi-origines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://url2.com:50120/. Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant. (source inconnue)
    Blocage d’une requête multi-origines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://url2.com:8001/. Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant.
    Ces 2 messages correspondent bien aux 2 instances qui sont UP, aucun message de ce type concernant l'instance 1 qui est down.

Discussions similaires

  1. [PHP 5.3] Affichage du résultat d'une requête multi-table sur plusieurs pages
    Par leaston dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2011, 16h19
  2. Humble demande d'aide pour une requête multi tables
    Par JayWBurn dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/06/2010, 15h27
  3. Réponses: 2
    Dernier message: 08/10/2009, 12h18
  4. [ACCESS] Ajouter un enregistrement dans une requête multi-table
    Par access_balou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h43
  5. modifier des données dans une requête multi table
    Par Bluman dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/02/2008, 10h00

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