WernerK: Zugriff verweigert

Hallo zusammen,

ich habe eine Minianwendung (Gadget) gemacht. Diese läuft auf einem Xampp mit Win7 plötzlich nicht mehr. Wenn ich das ganze im Internet Explorer aufrufe kommt ein Fehler "Zugriff verweigert".

Details zum Fehler auf der Webseite
------------------------------------------------------
Benutzer-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Zeitstempel: Wed, 7 Mar 2012 10:05:06 UTC

Meldung: Zugriff verweigert

Zeile: 36
Zeichen: 3
Code: 0
URI: http://localhost/JobStatus.Gadget/js/getstatus.js
------------------------------------------------------

In dieser getstatus.js habe ich aber nichts geändert.
----------------------------------------------

  
function GetXmlHttpObject()  
{  
if (window.XMLHttpRequest)  
  {  
  // code for IE7+, Firefox, Chrome, Opera, Safari  
  return new XMLHttpRequest();  
  }  
if (window.ActiveXObject)  
  {  
  // code for IE6, IE5  
  return new ActiveXObject("Microsoft.XMLHTTP");  
  }  
return null;  
}  
  
var xmlhttp;  
  
function getUserStatus(userid,ipaddress) {  
	  
	xmlhttp1=GetXmlHttpObject();  
	if (xmlhttp1==null){  
  		alert ("Browser does not support HTTP Request");  
  		return;  
 	}  
  
  var url="http://127.0.0.1/Web/get_status.php";//  
  var rand = Math.ceil(Math.random()*100000);  
  
  url=url+"?userid="+userid+"&ref="+rand;  
   xmlhttp1.onreadystatechange = function() {  
	handleResponseStatus(userid,ipaddress);  
  };  
  xmlhttp1.open("GET",url,true);  
  xmlhttp1.send(null);  
}  
  
function handleResponseStatus(userid,ipaddress){  
if (xmlhttp1.readyState==4){  
	document.getElementById("gadgetContent").innerHTML=xmlhttp1.responseText;  
		setTimeout(function(){getUserStatus(userid,ipaddress);}, 50000);  
	}  
}  

------------------------------------------------------

Die ganze Anwendung läuft auf einem anderen PC auch Xampp und Win7 einwandfrei. Auch wenn ich die "get_status.php" direkt im Browser aufrufe bekomme ich ein ergebnis.

Woran könnte das liegen bzw. wie könnte ich das debuggen?

Gruss
Werner

  1. Hallo,

    Zeile: 36
    Zeichen: 3

    ist der Quelltext in deiner Nachricht die Komplette Datei? weil in Zeile 36 wäre dann eine Leerzeile was wenig Sinn macht.

    Tim

    1. Hallo,

      der Firebug zeigt genau auf diese Zeile

      xmlhttp1.send(null);

      Keine Ahnung warum der request nicht mehr gehen soll?

  2. Hallo,

    URI: http://localhost/JobStatus.Gadget/js/getstatus.js

    var url="http://127.0.0.1/Web/get_status.php";//

    localhost ist nicht identisch mit 127.0.0.1, daher verhindert die vermutlich die Same-Origin-Policy den Zugriff.

    Verwende eine relative URL oder rufe das Script unter der Domain auf, die vom XMLHTTRequest angesprochen wird.

    Mathias

    1. Hallo Matthias,

      dein Ansatz war gut.
      Ich erstelle die Jobstatus.html Datei dynamisch mit PHP. Ich suche nach
      $_SERVER['SERVER_ADDR']
      Hier bringt mir mein testsystem den Wert ::1 zurück, also eine IPv6 Adresse
      Wenn hier die IP v6 Adresse steht [::1]
      <body id="JobstatusGadget" onload="getUserStatus(1,'[::1]');">

      Zeigt mir das Gadget (minianwendung) nichts an.
      Änder ich in
      <body id="JobstatusGadget" onload="getUserStatus(1,'127.0.0.1');">
      um dann geht es wieder.

      Kann das irgendwie mit einem Windows Update zusammenhängen?
      Ich hatte gestern einen Windows 7 Update und hatte aber an dem Code nichts geändert. Vor ein paar tagen funktionierte das noch auf dem gleichen System eimwandfrei.

      Offensichtlich kann das Gadget oder Windows nichts mit der IPv6 Adresse anfangen?

      gruss
      Werner

      1. Hallo,

        Wenn hier die IP v6 Adresse steht [::1]

        <body id="JobstatusGadget" onload="getUserStatus(1,'[::1]');">

        Zeigt mir das Gadget (minianwendung) nichts an.

        kein Wunder, wenn du die IP-Adresse in eckige Klammern setzt.
        Das tust du doch bei der IPv4-Adresse auch nicht - warum also hier?

        Ganz abgesehen davon halte ich es nicht für sinnvoll, IPv6 in einem kleinen LAN zu verwenden, das vermutlich hinter einem Router sitzt. Denn da wäre es ein Protokoll, das initialisiert wird und "auf Verdacht" zur Verfügung steht, somit Ressourcen belegt, aber nicht genutzt wird.
        Als lokales, LAN-internes Protokoll habe ich es auf allen meinen Rechnern deaktiviert.

        Ciao,
         Martin

        --
        Programmierer (m), seltener auch P~in (w):
        Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
        P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
        P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo Martin,

          kein Wunder, wenn du die IP-Adresse in eckige Klammern setzt.
          Das tust du doch bei der IPv4-Adresse auch nicht - warum also hier?

          Nun, im Browser muss man doch auch die eckige Klammer angeben oder?
          http://::1/meineweb/index.html  geht nicht, es muss
           http://[::1]/meineweb/index.html  heissen damit ich die Seite aufrufen kann.
          Daher dachte ich das ich das auch in dieser Gadget Anwendung brauche

          Ganz abgesehen davon halte ich es nicht für sinnvoll, IPv6 in einem kleinen LAN zu verwenden, das vermutlich hinter einem Router sitzt. Denn da wäre es ein Protokoll, das initialisiert wird und "auf Verdacht" zur Verfügung steht, somit Ressourcen belegt, aber nicht genutzt wird.
          Als lokales, LAN-internes Protokoll habe ich es auf allen meinen Rechnern deaktiviert.

          ja da hast du sicher recht. Bei meinem Testrechner mit Win7 ist ipv4 und ipv6 aktiviert. Offensichtlich bringt aber dann ein $_SERVER['SERVER_ADDR'] den Wert ::1 zurück.

          Vielleicht sollte ich es mal mit dem Rechnernamen probieren?

          Gruss
          Werner

        2. Moin Martin,

          kein Wunder, wenn du die IP-Adresse in eckige Klammern setzt.
          Das tust du doch bei der IPv4-Adresse auch nicht - warum also hier?

          Die eckigen Klammern um eine IPv6-Adresse sind eine gängige Notation, damit bestehende Parser einfach um v6-Adressen erweitert werden können.

          LG,
           CK

          1. Hallo,

            kein Wunder, wenn du die IP-Adresse in eckige Klammern setzt.
            Das tust du doch bei der IPv4-Adresse auch nicht - warum also hier?
            Die eckigen Klammern um eine IPv6-Adresse sind eine gängige Notation, damit bestehende Parser einfach um v6-Adressen erweitert werden können.

            danke für die Nachhilfe, diese Schreibweise kannte ich noch nicht.
            Die wenigen Male, die ich bisher IPv6-Adressen gesehen habe, waren sie ohne Klammern notiert.

            Ciao,
             Martin

            --
            Der Dienstweg ist die Abkürzung vom Holzweg zur Sackgasse.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Hallo,

        Ich erstelle die Jobstatus.html Datei dynamisch mit PHP.

        Wieso?

        Ich suche nach
        $_SERVER['SERVER_ADDR']

        Wozu brauchst du diese?

        Wenn es sich ohnehin um denselben Rechner handelt, von dem das HTML-Dokument ausgeliefert wird, dann verwende eine relative URL. Oder verwende http://de.selfhtml.org/javascript/objekte/location.htm#host@title=location.host in JavaScript.

        Mathias

        1. Hallo,

          Wieso?

          Nicht die ganze HTML Seite, sondern nur der teil mit der IP Adresse.

          Ich suche nach
          $_SERVER['SERVER_ADDR']

          Wozu brauchst du diese?

          Es handelt sich ja nicht immer rein um den selben Rechner. Das Ganze ist eine Intranet Lösung. Daher muss ich ja die IP Adresse des Webservers verwenden damit andere Clients zugreifen können. Aber vielleicht probiere ich es mal mit dem Windows Rechnername?

          Gruss
          Werner

          1. Daher muss ich ja die IP Adresse des Webservers verwenden damit andere Clients zugreifen können.

            Das wird nicht ohne weiteres gehen.

            Anscheinend verlierst du dich gerade in Nebenschauplätzen, die dich der Lösung vermutlich nicht weiterbringen werden.

            Das Grundproblem ist, dass der Browser Ajax-Requests nur zur selben Domain machen kann. Das ist die besagte Same-Origin-Policy.

            Man kann sich auf den Kopf stellen und mit IP-Adressen, Domainnamen und Co. herumspielen, aber solange HTML-Dokument mit dem Ajax-Script und der Zielserver des HTTP-Requests eine andere »Origin« haben, wirst du die Exception »Zugriff verweigert« bekommen.

            Cross-Domain-Ajax bekommst du nur mit CORS bzw. XDomainRequest hin (Browser-Unterstützung).

            JSONP wäre auch eine Möglichkeit.
            Oder Cross-Window-Messaging und Iframes.
            Oder oder oder.
            Standard-Ajax ohne CORS ist jedenfalls keine Möglichkeit.

            Mathias

            1. Hallo,

              Das wird nicht ohne weiteres gehen.

              Anscheinend verlierst du dich gerade in Nebenschauplätzen, die dich der Lösung vermutlich nicht weiterbringen werden.

              Hmm, du bist sicher der Experte und ich kann da nicht viel sagen.
              Ich kann dir nur sagen das es bei mir einwandfrei funktioniert, auch von entfernen Client PCs
              Der Client ruft eine Webseite auf, (die des Webservers) lädt das Gadget herunter und installiert es und schwub ist alles da.
              Ich habe es jetzt mal mit dem Rechnername ausprobiert und hier geht es auch.

              Gruss
              Werner

              1. Hallo,

                Ich kann dir nur sagen das es bei mir einwandfrei funktioniert, auch von entfernen Client PCs

                Dass Server und Cilent unterschiedliche Rechner sind, ist klar.
                Die Frage war, zu welchem Server das JavaScript Ajax-Calls absetzt.
                Offenbar zu dem Server, der das HTML-Dokument ausliefert. Sonst ginge es wie gesagt nicht.

                Ich habe es jetzt mal mit dem Rechnername ausprobiert und hier geht es auch.

                Dann habe ich dich missverstanden und gibt nur einen involvierten Server.

                Mathias