Textdatei mit ajax von externer URL holen - vista/7 gadget
ralphi
- javascript
0 Jo0 ralphi
0 Matti Mäkitalo
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
Hallo
Der Server unter 192.168.123.10 braucht zu lange, um eine Antwort zu senden.
Gruß Jo
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!?
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
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?
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
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
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;
}
}
?>