ralphi: Textdatei mit ajax von externer URL holen - vista/7 gadget

Hi Leute,

Ich bau mir momentan ein paar vista/7-gadgets
folgendes problem.
Ich möchte mit AJAX auf eine Datei zugreifen, die nicht auf dem selben Rechner ist.

var xmlhttp2=new XMLHttpRequest();
function neu()
{
var reload = new Date();

// 192.168.123.10 ist zwar der selbe Rechner wie localhost funktioniert aber nicht
// auch nicht mit dynDNS anstelle IP
//var mytext2="http://192.168.123.10/anrufmoni/aktuell.txt?"+reload.getTime();

// Die weiteren zwei links funktionieren mit index.htm auf dem server
//var mytext2="http://localhost/anrufmoni/aktuell.txt?"+reload.getTime();
var mytext2="../anrufmoni/aktuell.txt?"+reload.getTime();

// im gadget funktioniert gar nix - nicht mal wenn ich die Datei aktuell.txt direkt im Verzeichnis habe
//var mytext2="aktuell.txt";

xmlhttp2.open("GET",mytext2,true);  
 xmlhttp2.onreadystatechange=function()  
  {  
  alert(xmlhttp2.readyState+" und "+xmlhttp2.status);  
//Hier bekomme ich in den Fällen wo's nicht fuzt:  
2 und 0 -> 4 und 0 -> 1und 0 -> ende  

  if (xmlhttp2.readyState==4 && xmlhttp2.status==200)  
    {  
    checken(xmlhttp2.responseText); //Zur Auswertung  
    }  
  }  
xmlhttp2.send();	  

setTimeout("neu()",8000);
}

Kann mir jemand verraten was ich anscheinend, grundsätzlich falsch mache? Bisher hab ich AJAX immer problemlos innerhalb von htdocs eingesetzt.

grüße aus LA
ralphi

  1. Hallo

    Der Server unter 192.168.123.10 braucht zu lange, um eine Antwort zu senden.

    Gruß Jo

    1. Hi Jo

      Der Server unter 192.168.123.10 braucht zu lange, um eine Antwort zu senden.

      192.168.123.10 ist der localhost an dem ich grade programmiere. der server ist 192.168.123.1 bzw was ich bei xy.no-ip.org eingerichtet habe. beide verbindungen sind sehr schnell.
      aber 192.168.123.10, Win7(=Name) geht auch nicht = localhost geht aber,alles  der selbe rechner!?

  2. Hi,

    Ich bau mir momentan ein paar vista/7-gadgets
    Ich möchte mit AJAX auf eine Datei zugreifen, die nicht auf dem selben Rechner ist.
    Kann mir jemand verraten was ich anscheinend, grundsätzlich falsch mache? Bisher hab ich AJAX immer problemlos innerhalb von htdocs eingesetzt.

    ich habe noch keine derartigen "gadgets" entwickelt, daher kann ich nicht aus Erfahrung sprechen. Deine Problembeschreibung klingt aber danach, als ob das Thema Cross-Domain-AJAX deine Pläne durchkreuzt.

    In Kürze: in JavaScript ist es (meistens) nicht erlaubt, XML-HTTP-Requests an "fremde" Domains zu stellen, wobei "fremd" alles ist, was nicht zur Domain gehört, von der ausgeliefert wird.

    Ich vermute, dass dein Gadget im file://-Kontext läuft (korrigiere mich, wenn das falsch ist). U.U. kannst du mit CORS gegensteuern.

    Bis die Tage,
    Matti

    1. Hi Matti,

      ich habe noch keine derartigen "gadgets" entwickelt, daher kann ich nicht aus Erfahrung sprechen. Deine Problembeschreibung klingt aber danach, als ob das Thema Cross-Domain-AJAX deine Pläne durchkreuzt.

      Das denke ich mittlerweile auch. Auch wenn ich es im Apache des Client starte (mit txt auf xy.no-ip.org) also ohne Wingadget bekomme ich den 'status' nicht auf 200. Im IE weist er mich auf die fremde Verbindung hin. Im Mozilla macht er auch nix viel anderes.

      Ich müsste nur 'im Header Server' die option
      Access-Control-Allow-Origin: *
      einfügen.

      Ich weis allerdings nicht genau, in welche config ich das beim apache, in der die txt bzw php zum auslesen steht, einfügen muss?

      • Das mir der Server,

      HTTP/1.1 200 OKDate: Mon, 01 Dec 2008 00:23:53 GMTServer: Apache/2.0.61 Access-Control-Allow-Origin: *Keep-Alive: timeout=2, max=100Connection: Keep-AliveTransfer-Encoding: chunkedContent-Type: application/xml [XML Data]

      liefert.
      Beispiel aus:
      anzeige handshake

      grüße aus LA
      ralphi

      1. hi zusammen,

        jetzt funktionierts, obwohl es eigentlich nicht dürfte!

        Ich hab lediglich den IE9 neu installiert also einstellungen auf default. Mit Firefox gehts immer noch nicht - stört natürlich beim win-gadget nicht weiter.

        Folgenden code hab ich jetzt im gadget (index.htm):

          
        var xmlhttp=new XMLHttpRequest();  
        function neu()  
        {  
          
        		var reload = new Date();  
        		var mytext="http://meineDNS.no-ip.org/anrufmoni/aktuell.txt?"+reload.getTime();  
        		  
        		xmlhttp.open("GET",mytext,true);  
        		//alert(mytext);  
        	 xmlhttp.onreadystatechange=function()  
        	  {  
        	  //alert(xmlhttp.readyState+" und "+xmlhttp.status);  
        	  if (xmlhttp.readyState==4 && xmlhttp.status==200)  
        	    {  
        	    checken(xmlhttp.responseText);  
        	    }  
        	  }  
        	xmlhttp.send();	  
        //setTimeout("neu()",8000);  
        }  
        
        

        wer auch gadget machen will, empfehle ich das
        Tutorial

        mich würden allerdings die einstellungen für CORS, nachwievor noch interessieren.

        grüße aus Landshut
        ralphi

      2. Ich müsste nur 'im Header Server' die option
        Access-Control-Allow-Origin: *
        einfügen.

        Ich weis allerdings nicht genau, in welche config ich das beim apache, in der die txt bzw php zum auslesen steht, einfügen muss?

        Derlei macht man regelmäßig in der Datei .htaccess des Verzeichnisses in dem die Datei oder Ressource liegt, welche den XMLHttpRequest auslöst.

        Voraussetzung ist, dass die Konfiguration des Apache das erlaubt. (Allow overwrite).

        Andere Lösung: Du bietest Deine HTML-Date als php-Skript an und schreibts vor das HTML:

        <?php header('Access-Control-Allow-Origin: http://192.168.1.2); ?>

        (oder wie auch immer Du den XHTML-Request adressierst.

        Weitere Lösung:

        Du schreibst Dir mit z.B. PHP oder was auch immer eine Art Proxy-Skript, welches Du an der Stelle plazierst, wo Du auch die die Datei oder Ressource liegen hast, welche  den XMLHttpRequest auslöst. Im XMLHttpRequest addressierst Du den "Proxy".

        In beiden Fällen wirst Du Dich mit serverseitigen Techniken auseinandersetzen müssen. Das "Proxyskript" könnte in der einfachen, hoffentlich halbwegs sicheren Version so aussehen:

        <?php  
        ### xml_proxy.php  
        ### Konfiguration:  
        $addr_default='http://localhost/info.php'; ### keine Sicherheitsprüfung für default-Adresse  
          
        $ar_beginn_erlaubte_uris=array (  
                'http://192.168.1.3/test.php'  
                'http://foo_bar.example.com/test.php'  
        );  
          
        $ar_beginn_erlaubte_hosts=array (  
                '192.168.1.1',  
                '192.168.1.2'  
        );  
          
          
        ### Sicherheitsprüfung auf Host:  
        if (isset($_SERVER['REMOTE_ADDR'])) {  
            $erlaubt=false;  
            foreach ($ar_beginn_erlaubte_hosts as $a) {  
        	  if ($a == $_SERVER['REMOTE_ADDR']) {  
        	      $erlaubt=true;  
        	  }  
            }  
          exit_wenn_nicht_erlaubt($erlaubt, 'Host: '.$_SERVER['REMOTE_ADDR']);  
        }  
          
        ### Sicherheitsprüfung auf Quelle:  
        if (isset($_GET['addr'])) {  
              $addr=$_GET['addr'];  
              $erlaubt=false;  
              foreach ($ar_beginn_erlaubte_uris as $s) {  
                   if ( 0== strpos($addr,$s) ) {  
                         $erlaubt=true;  
                   }  
               }  
            exit_wenn_nicht_erlaubt($erlaubt, 'Addresse');  
          
        } else { ### Deafult-Adresse  
               $addr=$addr_default;  
               $_GET['addr']=$addr;  
        }  
          
        ### Proxy  
        header('Content-Type: application/xml');  
        if (! readfile($addr)) {  ## holt und sendet, ist der eigentliche Proxy  
             header("HTTP/1.0 404 ot Found");  
             header("Content-Type: text/html");  
             print '<html><body><h1>Ressource "'.htmlentities($addr).'" existiert nicht!</h1></body></html>';  
        }  
          
          
        function exit_wenn_nicht_erlaubt($b, $grund)  {  
              if (! $b) {  
                  header("HTTP/1.0 403 Forbidden");  
                  header("Content-Type: text/html");  
                  print "<html><body><h1>Zugriff Verboten</h1><p>Grund: ". $grund."</p></body></html>";  
                  exit;  
              }  
        }  
        ?>