Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server)

abc1042

Mitglied
Hallo zusammen,

ich versuche per Applet Daten mit Hilfe einer auf dem Server abgelegtem PHP-Skript mittels InputStream einzulesen. Leider bekomme ich immer Zugriff verweigert zurück. Hier mein Code:

Java:
URL url = new URL("https://meinserver.de/irgendwas.php");

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
InputStream is = url.openStream();

String output= new Scanner(is).useDelimiter("\\Z").next();

Mir ist aufgefallen, dass ich nicht immer diesen Zugriffsfehler bekomme. Wird das Applet auf einer auf dem Server befindlichen HTML-Seite mitgeladen funktioniert es. Will ich jedoch durch eine Aktion im geladenen Zustand Daten, wie oben angegeben, nachladen, bekomme ich den Zugriffsfehler wieder.

Kann man das irgendwie umgehen? Ich will ja nur über eine Schnittstelle Daten einlesen und diese nicht verändern.

Vielen Dank für eure Antworten.

Alex
 
Code:
https:
das bedeutet: SSL-gesicherte Übertragung

Du willst auf eine mit SSL verschlüsselte Seite Zugreifen, vielleicht liegt es daran.

Vladimir
 
Kriegst du eine SecurityException ? Hast du das Jar signiert?

Ich erhalte

Java:
java.security.AccessControlException: access denied

Das siginieren will ich wenn möglich umgehen, da dies für mich nicht praktikabel wäre.

Mir ist aufgefallen, dass auf meinem lokalen Testserver das Problem nicht auftritt. Kann es auch an den Sicherheitseinstellungen vom Webserver liegen?

Gehts von einer normalen lokalen swing app aus?

Es ist ein normales Java Applet ohne Swing. In dem Applet lasse ich mir nur eine Grafik erstellen mit Daten von einer PHP-Schnittstelle.
 
Nein, es kann nicht am Webserver liegen. Denn das Jar wird heruntergeladen und läuft auf dem Computer des Clients. Du musst für solche Sachen dein Jar signieren. Man kann natürlich die Datei [c]java.policy[/c] updaten, aber das kannst du logischerweise nur lokal machen 😉
Ah ja, der Grund warum es ging ist IMHO: [c]localhost[/c] hat sicher eine Ausnahme-Permission.
 
Am localhost kann es nicht gelegen haben, da ich das PHP-Skript immer mit der Domain oder der IP aufrufe und nie über localhost.

Was mich nur immer wundert, dass es auf meinem Testsystem ohne Probleme läuft, obwohl ich auch da das PHP-Skript mit der IP des Servers aufrufe. Es ist also kein lokaler Zugriff. Dies spricht ja doch eher für eine Einstellungssache des Apache, oder nicht?

Außerdem dachte ich immer nur, dass man eine Signierung dafür benötigt, wenn man auf den Clientrechner mit einem Applet zugreifen will. Ich will aber nur (grob umschrieben) eine Internetseite aufrufen und die daraus erhaltenen Textzeilen weitereverarbeiten.
 
...oder ich vermute, dass die Exception fliegt, wenn der Socket nicht auf den gleichen Host zugreifen will, auf dessen das Applet heruntergeladen wurde.
http://objectmix.com/java/76133-socketpermission-signed-applet.html hat gesagt.:
Applets are not allowed to connect to servers other than the ones they came.
Scheint also so zu sein 😉
 
Ich habe jetzt nochmal etwas rumprobiert. Wenn ich das Applet mit Netbeans lokal starte und auf den Webserver zugreife, der nicht bei uns im lokalen Netz liegt, dann wird das Applet geladen und alles funktioniert ohne Probleme. Ich bekomme keine Zugriffsprobleme.

Starte ich das gleiche Applet außerhalb von Netbeans über eine HTML-Datei auf meinen lokalen PC, bekomme ich den Fehler. Was ist in Netbeans anders, so dass es dort funktioniert und als generiertes Applet nicht?

Ich bin da echt ratlos.
 
Hast du schon Mal zu diesem Thema im Internet gesucht? Ich denke nicht, denn da gibts genug Infos... Es sind - wie bereits gesagt - die Sicherheitseinstellungen! Ein Applet im Browser (über das Browser Java Plugin) soll nicht so viele Rechte besitzen, wie wenn ich in meiner Umgebung diese laufen lass. Ansonsten könnte ich dir ein "unsichtbares" Applet unterjubeln und sicher viel Spass haben (wenn ich auf jegliche Hosts zugreifen kann, deine Dateien lesen und schreiben kann etc.).
 
Ich werde es gerne mit einem signierten Applet versuchen.

Ich habe da aber nochmal eine Frage zu den eingeschränkten Rechten von Applets: Ich habe es so verstanden, dass diese nur auf die Daten und Ressourcen vom Client eingeschränkt sind. Ich will aber garnicht auf den Clientrechner zugreifen. Ich will auf eine Datei auf meinem Webserver zugreifen, um Daten einzulesen. Diese API ist mit einem Sicherheitsschlüsseln gesichert, so dass dort niemand ohne weiteres rankommt. Irgendwie ist das unlogisch, dass dafür das Applet keine Rechte haben soll. Webstart-Anwendungen und normale Java-Programme haben damit ja auch keine Probleme.

Kann es wirklich nur daran liegen???
 
Ich will auf eine Datei auf meinem Webserver zugreifen, um Daten einzulesen. Diese API ist mit einem Sicherheitsschlüsseln gesichert, so dass dort niemand ohne weiteres rankommt. Irgendwie ist das unlogisch, dass dafür das Applet keine Rechte haben soll.

Wie gesagt, wenn du das Jar von [c]faetzminator.ch[/c] laufen lässt, dann hat es genau die Berechtigung, um Sockets auf [c]faetzminator.ch[/c] (und evtl. auf dessen IP(s) und Subdomains) zuzugreifen. Das klingt aber bei dir nicht so.
 
Also, in der
Code:
public void init()
von meinem Applet rufe ich die folgende Funktion auf, die mir dann die Daten holen soll:

Java:
public static String MakeUrlRequest(String URLArgs) {
    String output = null;
        
    try {
        String input;
        URL url;

        url = new URL("http://www.meinserver.de/api.php?" + URLArgs);

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream is = url.openStream();

        output = new Scanner(is).useDelimiter("\\Z").next();
    }
    catch(Exception e) {e.printStackTrace();}
        
    return output;
}

Wenn ich dann Daten nachladen will, rufe ich die gleiche Funktion wieder auf und rufe repaint() auf.

Also wenn ich das Applet durch eine HTML-Datei auf dem Server laden lasse wird die Funktion
Code:
public static String MakeUrlRequest(String URLArgs)
erfolgreich ausgeführt. Fordere ich jetzt per Javascript das Applet auf, diese Funktion erneut auszuführen um die Daten neuzuladen bekomme ich den Zugriffsfehler.

Rufe ich das Applet mit einer HTML-Datei auf einem anderen Server auf, erhalte ich sofort den Zugriffsfehler.

Starte ich das Applet aus Netbeans auf meinem lokalen PC, funktioniert alles so wie es laufen soll, obwohl die PHP-Datei auf meinem Webserver liegt.

Wenn das wirklich durch Einschränkungen des Applets hervorgerufen wird, werde ich mir wohl einen anderen Weg einfallen lassen müssen, eventuell einen externen Datenbankzugriff, auf den ich mit dem Applet zugreife oder so...
 
Also wenn ich das Applet durch eine HTML-Datei auf dem Server laden lasse wird die Funktion
Code:
public static String MakeUrlRequest(String URLArgs)
erfolgreich ausgeführt.
Sollte auch so sein.
Fordere ich jetzt per Javascript das Applet auf, diese Funktion erneut auszuführen um die Daten neuzuladen bekomme ich den Zugriffsfehler.
Wie machst du das denn? Hast du uns etwas JS Code? Klingt komisch...
Rufe ich das Applet mit einer HTML-Datei auf einem anderen Server auf, erhalte ich sofort den Zugriffsfehler.
Ebenfall logisch.
Starte ich das Applet aus Netbeans auf meinem lokalen PC, funktioniert alles so wie es laufen soll, obwohl die PHP-Datei auf meinem Webserver liegt.
Auch logisch -> andere Berechtigungen.
 
Mit folgenden zwei Zeilen mache ich das in Javascript:

Java:
document.appletName.loadData();
document.appletName.repaint();

in
Code:
loadData()
wird die oben genannte Funktion
Code:
MakeUrlRequest(String URLArgs)
mit den richtige Parametern aufgerufen.
 
Nochmal hallo zusammen,

ich habe mir jetzt mal mein Applet signiert. Leider hat es nur einen Fortschritt gebracht: Jetzt kann ich den ersten Aufruf der Schnittstelle auch von einem entfernten Server durchführen. Sobald ich aber durch Javascript dem Applet sagen, dass es sich die Daten nochmal holen soll, bekomme ich wieder den Zugriffsfehler. Also liegt der Fehler nicht an der Signierung. Hat noch einer eine Idee??? Wie gesagt, auf meinem lokalen Testsystem läuft es ohne Probleme, nur auf meinem Webserver, wo ich es jetzt draufpacken will, will es irgendwie nicht...

Schon mal Danke im Voraus.
 
Was für eine Exception wird geschmissen, wenn du das Javascript laufen lässt? Ich dachte die ganze Zeit an eine Java-seitige. Ist aber wohl ehner seitens JS?
 
Was für eine Exception wird geschmissen, wenn du das Javascript laufen lässt? Ich dachte die ganze Zeit an eine Java-seitige. Ist aber wohl ehner seitens JS?

Die Exception lautet immer noch:

Java:
java.security.AccessControlException: access denied (java.net.SocketPermission www.meinserver.com:80 connect,resolve)

Das Fehlerkonsole von Javascript gibt keinerlei Fehler aus.

Was für Daten holst du denn mit deiner PHP-Datei?

Ich lass mir nur einen String zurückgeben, denn ich dann in Java zerpflüge. Zum einen baue ich mir aus den Daten dann Polygone im Applet und zum anderen ist es eine Bild-URL, die ich mir durch das Applet anzeigen lasse.
 
Ich kann mir vorstellen, dass es die Art und Weise ist, wie du auf deinen Server zugreifst.
Auch wenn du auf den Server zugreifst, von dem das Applet geladen wurde, wäre es klüger sich immer vom Kontext des Applets ausgehend, also mit einer relativen URL durch das Dateisystem auf deinem Server zu bewegen.

Probiere daher mal Code-Stücke wie diese:
Java:
URL url = url = new URL(getCodeBase(), "./api.php?" + urlArgs);
 
Ich kann mir vorstellen, dass es die Art und Weise ist, wie du auf deinen Server zugreifst.
Auch wenn du auf den Server zugreifst, von dem das Applet geladen wurde, wäre es klüger sich immer vom Kontext des Applets ausgehend, also mit einer relativen URL durch das Dateisystem auf deinem Server zu bewegen.

Genau das gleiche Ergebnis... Ich bin echt ratlos!
 

Neue Themen


Zurück
Oben