2009-03-06 13 views
5

Ich habe ein grundlegendes Applet zusammengestellt, wo der Benutzer eine Datei von ihrer Festplatte auswählt, die erste Zeile dieser Datei liest und diese an JavaScript für einige zusätzliche Vorverarbeitung weitergibt, und dann, wenn Sie auf a klicken Mit der Schaltfläche wird versucht, diese Datei über eine HTTP-POST-Anforderung hochzuladen. Ich habe ein sehr einfaches Open-Source-Applet zum Hochladen von Dateien gefunden, das ich für dieses letzte Bit kopiert und modifiziert habe.Java Applet Permissions

Das Problem ist, obwohl es nicht ganz funktioniert. Es scheint, als ob es gut läuft, aber dann stoße ich auf zwei Fehler in Bezug auf Berechtigungen. Die Nachrichten in der Java-Konsole sagen, dass die Applet Zugriff hatten Fehler auf den beiden folgenden Berechtigungen verweigert:

java.lang.RuntimePermission setFactory 
java.io.FilePermission read 

ich diese seltsamen, weil ich dachte, dass ich bereits die Erlaubnis zum Applet gewährt hatte, als ich es mit dem eingebauten " selbstsignierte "Option in NetBeans aktiviert und dann geklickt, um das kleine Sicherheits-Popup im Browser zu bestätigen.

Auch der Teil, den ich selbst codiert habe, wo es die Datei liest und die erste Zeile an JavaScript weitergibt, funktioniert gut. Dies ist ein ziemlich deutlicher Hinweis darauf, dass das Applet in der Lage ist, aus dem lokalen Dateisystem zu lesen! Das Problem beginnt erst, wenn ich versuche, den Upload zu starten. Eine Sache, die ich beachten sollte, ist, dass der Upload-Prozess in einem neuen Thread zu laufen scheint, während der Rest alles in der Hauptklasse läuft, ohne Threads zu erstellen.

Ich bin ein absoluter Neuling in Java und weiß sehr wenig über Threads in Java; Muss ich die Berechtigungen irgendwie auf diesen neuen Thread übertragen? Oder etwas in diesem Sinne? Vielen Dank im Voraus.

Antwort

3

Wahrscheinlich müssen Sie den Sicherheitsmanager (Code, nicht Administrator) nach der Berechtigung für eine privilegierte Operation fragen. Aus verschiedenen Gründen ist es im Allgemeinen nicht gut für ein Applet, eine lokale Datei öffnen zu können, daher ist es ziemlich stark geschützt.

Der grundlegende Schlüssel ist, AccessController.doPrivileged() zu benennen, und es gibt eine good little tutorial auf es auf der Java Ranch FAQ.

+0

doPrivileged ist enorm gefährlich. Wie das Signieren von Applets. –

+3

Ermöglicht es Applets, Dateien zu lesen. Nichtsdestoweniger ist es da und die Antwort auf die Frage. –

0

Es ist wahrscheinlich, weil das JavaScript unsigniert ist. Ich schlage vor, keinen Code zu signieren, besonders wenn Sie nicht wissen, was Sie tun. Seit 6u10 (noch nicht Mac) können Applets JNLP einschließlich FileOpenService verwenden, so dass Sie nicht unterschreiben müssen.

+0

nicht JavaScript; Java. – Ricket

+0

Die Frage besagt, dass JavaScript beteiligt ist. Meine Vermutung ist, dass JavaScript in den Kontext der Zugriffskontrolle, die das Problem verursacht. –

1

Ich hatte ein ähnliches Problem, das für immer zu lösen dauerte. Es stellt sich heraus, dass Applet-Methoden, die aus JavaScript aufgerufen werden, keine Berechtigungen haben, auch wenn Sie sie explizit in einer Richtliniendatei gewähren.

Diese Umgehungs funktionierte für mich (Hinzufügen von Befehlen an eine Warteschlange, die das Applet Schleifen durch): http://blog.carrythezero.com/?p=5

Achten Sie darauf, die Gefahren verstehen sich hier: Jeder JavaScript auf einer Seite ändern können und ändern, was in der Fed immer Applet. In meinem Fall weiß ich, dass der Code niemals auf einem Webserver läuft, und die Klasse ist nicht signiert, so dass sie fehlschlägt, es sei denn an dem von meiner Richtliniendatei bestimmten Ort.