Beckerman2609 Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Hallo zusammen, ich möchte Daten von einem Applet aus speichern. Das Applet wird von einem Server gestartet. Auf dem gleichen Server sollen auch die Daten gespeichert werden. Mir ist bewusst, dass die Applets eine hohe Sicherheitseinstufung haben. Jedoch habe ich Informationen gefunden, die besagen, dass ein Applet auf dem Server auf dem es gestartet wurde auch mehr Rechte hat. Mir ist es schon gelungen eine .txt auszulesen, jedoch bekomme ich es nicht hin, in eine .txt zu schreiben. Mein Leseaufruf sieht folgendermaßen aus: URL url = new URL("file:///Z:/pfadangabe/test.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); debugZeile = br.readLine(); Ich habe auch schon verschiedene Schreibroutinen versucht, leider ohne erfolg: Versuch 1: URL url = new URL("file:///Z:/pfadangabe/test.txt"); File ausgabeDatei = new File (url.getFile()); FileWriter fw = new FileWriter(ausgabeDatei); BufferedWriter bw = new BufferedWriter(fw); bw.write("Testabc"); bw.close(); -> Klappt nicht Versuch 2: URL url = new URL("file:///Z:/pfadangabe/test.txt"); HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(httpConn.getOutputStream())); bw.write("Testabc"); bw.close(); -> Klappt auch nicht Da mir das Lesen ja gelingt verstehe ich nicht genau warum ich nicht schreiben kann. Kennt jemand von euch das Problem? Oder noch besser: die Lösung? Zitieren
kingofbrain Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 "Klappt nicht" und "Klappt auch nicht" sind keine Fehlerbeschreibungen. Sag uns, was nicht klappt (Exception), dann können wir weitersehen. Schöne Grüße, Peter Zitieren
perdian Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Ein Applet darf - sofern es nich signiert wurde und damit eine ganze Reihe zusätzlicher Permissions erhält - prinzipiell auf keine externen Ressourcen zugreifen. Das bedeutet jegliches Hantieren mit java.io.File Objekten verbietet sich von vorneherein. Schlicht nicht möglich. Erlaubt ist der Zugriff auf URLs, die vom gleichen Server geladen werden, von dem auch das Applet geladen wurde. Mehr nicht. Die Lösung für dein Problem ist ein wenig komplizierter, als du dir das momentan vorstellt. Ein Applet läuft im Client-Context ab und hat daher - signiert oder unsigniert - keinerlei schreibenden Zugriff auf den Server. Du wirst also auf dem Server einen Service einrichten müssen, der auf Requests vom Applet wartet und die eigentliche Verarbeitung auf dem Server (Files schreiben, etc.) übernimmt. Zitieren
Beckerman2609 Geschrieben 5. Mai 2010 Autor Geschrieben 5. Mai 2010 (bearbeitet) Sorry, Bekomme eine "java.security.AccessControlException: access denied (java.io.FilePermission ...test.txt write)" Hat also irgendwas mit den Rechten zu tun. Aber warum kann ich die Datei lesen, aber nicht schreiben? Übrigens: Das ganze Programm soll in einem Intranet laufen. Es muss also keine Internetverbindung aufgebaut werden können. Bearbeitet 5. Mai 2010 von Beckerman2609 Zitieren
Beckerman2609 Geschrieben 5. Mai 2010 Autor Geschrieben 5. Mai 2010 Das hört sich ja nicht ganz so gut an. Ist es denn möglich über das Applet einen Batch oder ähnliches anzuschmeißen welchem man die Parameter übergibt und diese dann weggeschrieben werden? Oder wie kann ich anders eine Schnittstelle zwischen Applet und Server programmieren? Zitieren
kingofbrain Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Wie perdi schon sagte, muss auf Dein Server beim anfordern einer bestimmten URL das File lesen und ausliefern. Wie Du das dort regelst, ist egal. Als Hilfe für Deine Fragen zum Filezugriff vom Applet aus: Essentials, Part 1, Lesson 6: File Access and Permissions Schöne Grüße, Peter Zitieren
flashpixx Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Ich würde wohl dazu tendieren, eine entsprechende Applikation auf dem Server laufen zu lassen, wie z.B. einen Webservice oder DAV usw und dem Applet dann eine entsprechende Verbindung zu der Applikation ermöglichen. Das Applet läuft immer auf der Clientseite und hat somit keinen direkten Serverzugriff. Bevor man nun anfängt den Server zu zerschießen und unsicher zu machen, sollte man sich entsprechende Schnittstellen überlegen Zitieren
perdian Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Ist es denn möglich über das Applet einen Batch oder ähnliches anzuschmeißen welchem man die Parameter übergibt und diese dann weggeschrieben werden?Nicht in der Art und Weise, wie du dir das vorstellt. Mach dir bitte zunächst klar, in welchem Kontext das Applet bzw. die JVM in der es sich befindet läuft. Die Ausführung findet auf dem Clientrechner statt. Der weiß erstmal überhaupt nicht, dass es Server existiert auf dem irgendetwas ausgeführt werden soll. Es hat daher auch erstmal nur Zugriff auf die Clientressourcen - und das auch nur beschränkt (siehe Sandboxkonzept). Mach dir dann klar, was auf dem Server passieren soll und wie du dort die Verarbeitung initiierst. Dann überlege, wie die Schnittstelle zwischen Applet und Server aussehen kann. Innerhalb eines (unsignierten) Applets bist du fast schon zwangsweise auf eine HTTP basierte Kommunikation angewiesen, das bedeutet du musst auf Serverseite einen Dienst einrichten, der auf HTTP Requests hört. Dies könnte z.B. ein Servlet sein, kann aber auch ein kleines Programm sein, dass direkt auf Port 80 lauscht und die Daten verarbeitet. Aber nochmal: Mach dich zunächst mit den übergeordneten Konzepten vertraut, bevor du an die eigentliche Implementierung gehst. Zitieren
Beckerman2609 Geschrieben 5. Mai 2010 Autor Geschrieben 5. Mai 2010 Habe mir jetzt mal die Sache mit den Policys durchgelesen. Habe auch schon eine Erstellt. Mit dem Tool habe ich eine Policy-Datei erstellt und diese in meinem Programm-Ordner hinzugefügt. Ganz so wie es auf der Seite erklärt ist. Hat aber auch nicht funktioniert. Bin da jedoch noch bei mich weiter einzuarbeiten. Jetzt zu der Serververbindung: Habe mich auch über die Kommunikation mit Servlets informiert. Dafür ist ja (so wie ich verstanden habe) ein Webserver nötig. Da wir einen solchen nicht im Hause haben müsste ich den auch noch extra für dieses Schreibrecht aufbauen. Kann man hierfür auch ein "normales" Java-Programm irgendwie für nehmen? Also ganz nach Client/Server-Socketprogrammierung? Weiß jemand ob es sich lohnt noch weiter in die Zertifikats/Signierung/Policy-Schiene zu informieren? Habe da so einiges gelesen was ich erstmal verstehen muss. Und wie weiter oben erwähnt zeigen die ersten Taten mit der Handhabung von Policies keine Wirkung. Auf jeden Fall erstmal Danke für die rege Beteiligung Zitieren
flashpixx Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Habe mich auch über die Kommunikation mit Servlets informiert. Dafür ist ja (so wie ich verstanden habe) ein Webserver nötig. Da wir einen solchen nicht im Hause haben müsste ich den auch noch extra für dieses Schreibrecht aufbauen. Was haben Schreibrechte mit Servlets zu tun? Ein Server ist erst einmal ein Stück Software, dass einen Dienst bereit stellt. Wie man diesen Dienst dann im konkreten umsetzt, müsstest Du halt schauen. Aber warum den Umweg über Serverlets, ein Webservice z.B. mit nuSOAP ist recht schmal und lässt sich mit PHP umsetzen Kann man hierfür auch ein "normales" Java-Programm irgendwie für nehmen? Also ganz nach Client/Server-Socketprogrammierung? Kann man machen, aber wenn Du keinerlei Erfahrung darin hast, würde ich aus Sicherheitsgründen abraten, denn ein Serverdienst, den Du dann entwickeln musst, setzt natürlich Schwerpunkte auf Performance und Sicherheit. Zitieren
perdian Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Habe mir jetzt mal die Sache mit den Policys durchgelesen. Habe auch schon eine Erstellt.Du brauchst keine Policies! Du willst ja nicht vom Applet heraus Dateien auf dem Clientrechner beschreiben (denn nur das wird dir duch eine Policy erlaubt) sondern vom Client Nachrichten an den Server senden, der dann wiederrum das Schreiben von Dateien übernehmen soll. Da auf dem Server dann aber kein Applet sondern ein "richtiges" Programm laufen wird benötigst du da auch keine speziellen Policies. Habe mich auch über die Kommunikation mit Servlets informiert. Dafür ist ja (so wie ich verstanden habe) ein Webserver nötig. Da wir einen solchen nicht im Hause haben müsste ich den auch noch extra für dieses Schreibrecht aufbauen. Kann man hierfür auch ein "normales" Java-Programm irgendwie für nehmen? Also ganz nach Client/Server-Socketprogrammierung?Ja, du kannst hier auch ein "normales" Java-Programm nehmen. Wenn du dir z.B. einen Tomcat oder Jetty installierst haben beide in der Standardinstallation automatisch Schreibrechte für den Zugriff auf das lokale Dateisystem. Zitieren
Beckerman2609 Geschrieben 5. Mai 2010 Autor Geschrieben 5. Mai 2010 Habe bisher keine Erfahrungen mit php. Socketprogrammierung habe ich teilweise schon in Java durchgeführt. Nach meinem aktuellen Wissensstand würde ich jetzt versuchen ein Server-Programm zu programmieren, welcher auf eine Nachricht eines Client-Programmes wartet (Also das Applet). Wieso ist es denn dem Applet möglich eine txt zu lesen, sie aber nicht zu schreiben. Müsste das nicht aus gleichem Grund verboten sein? Wegen der Sache mit Tomcat und Servlets: Ist es denn möglich ein solches Programm ohne einen Webserver laufen zu lassen? Das ganze Programm ist Teil eines Projektes welches auch komplett Dokumentiert und Präsentiert werden wird. ich sollte den Umgang mit meinen benutzten Tools also auch verstehen und habe es nicht zwangsweise nötig mich mit nochmehr neuem Material zu beschäftigen. Ihr wisst schon... Zitieren
flashpixx Geschrieben 5. Mai 2010 Geschrieben 5. Mai 2010 Wieso ist es denn dem Applet möglich eine txt zu lesen, sie aber nicht zu schreiben. Müsste das nicht aus gleichem Grund verboten sein? Das Applet läuft auf dem Client in einer Sandbox und braucht eben ggf mehr Berechtigungen (Sicherheitskonzept der Browser). Auf den Server kann es nicht schreiben, weil es dort nicht läuft. Ist es denn möglich ein solches Programm ohne einen Webserver laufen zu lassen? Natürlich, wenn Du Dich eben selbst um die Kommunikation kümmerst. Nur wenn Du so etwas noch nicht in größeren Projekten realisiert hast, dann ist dies ein Sicherheitsrisiko, da man bei unsachgemäßer Programmierung diesen Dienst missbrauche kann. Außerdem solltest Du Dir auch Gedanken über die Performance machen, denn wenn auf den Dienst ein paar 1000 Connections statt finden, solltest Du diese auch richtig verarbeiten können und diese sollten dann nicht den Server lahmlegen. ich sollte den Umgang mit meinen benutzten Tools also auch verstehen und habe es nicht zwangsweise nötig mich mit nochmehr neuem Material zu beschäftigen. Ihr wisst schon... Dann schraub Deine Ansprüche runter. Du kannst nicht mit einem Applet auf das Dateisystem des Servers zugreifen, d.h. Du musst eine Schnittstelle schaffen, wie diese konkret aussieht, darüber musst Du Dir Gedanken machen, es gibt dafür mehrere Möglichkeiten z.B. wäre RMI auch noch eine Java-Only-Alternative zu Soap. Letztendlich musst Du aber Dich mit dem Thema Kommunikation auseinander setzen Zitieren
perdian Geschrieben 6. Mai 2010 Geschrieben 6. Mai 2010 Wieso ist es denn dem Applet möglich eine txt zu lesen, sie aber nicht zu schreiben. Müsste das nicht aus gleichem Grund verboten sein? Ist es auch! Du kannst keine Datei direkt lesen, jeder Aufruf von new File("irgendwas") wird in einem unsignierten Applet fehlschlagen. Was du kannst ist eine Ressource aus dem Classpath zu lesen. Da wird während der Entwicklung innerhalb einer IDE in der Regel in einen Fileaufruf umgesetzt (weil hier die Classes und Ressourcen eben direkt im Filesystem liegen) muss aber in einer Produktionsumgebung nicht zwangsläufig auch so laufen. Vom Gedanken her ist es ganz einfach: Du darfst in einem Applet nichts tun, was dazu geeignet wäre lokale Ressourcen des Rechners, auf dem das Applet läuft, an jemand anders zu übermitteln. ich sollte den Umgang mit meinen benutzten Tools also auch verstehen und habe es nicht zwangsweise nötig mich mit nochmehr neuem Material zu beschäftigen.So wird es nicht funktioniert. Softwareentwicklung ist eben mehr als ein Klick hier und ein Klick da, und schon hast du das Ergebnis, was du haben willst. Für bestimmte Bereiche wirst du dich mit den Interna beschäftigen müssen und verstehen müssen was hinter den Kulissen passiert. Wenn du das nicht willst schließe ich mich flashpixx an: Schraube deine Ansprüche herunter. Von nichts kommt nichts. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.