Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Kann es sein, das ich in einem Applet, egal ob signiert oder nicht, nicht mittels File auf lokale Dateien zugreifen kann?!?!
Hier mal das Applet:
Code:
import java.awt.*;
import java.io.File;
public class FileExists extends java.applet.Applet
{
public void fileExists(){
File f = new File("c:/tmp/log.txt");
if (!f.exists()){
System.out.println("FILE NOT FOUND");
}else{
System.out.println("FILE FOUND");
}
}
public void init()
{
fileExists();
}
}
Obwohl ich das Applet signiert habe, bekomme ich eine Exception:
Doch, das geht, Dein Code ist auch in Ordnung. Du hast wahrscheinlich einen Fehler beim Signieren gemacht.
Ich habe mal ein entsprechendes Beispiel-Applet geschrieben, das nach deiner Datei c:\tmp\log.txt sieht.
Das Applet ist signiert und läuft ab Java 1.4.2.
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>FileExistsApplet-Applet</title>
</head>
<body>
<h1>FileExistsApplet-Applet</h1>
<applet archive="FileExistsApplet.jar" code="FileExistsApplet.class" width="0" height="0">
</applet>
</body>
</html>
Der Quellcode ist im Jar-File. (also nur entpacken)
Zum Thema Signieren gibts in der FAQ ein kleines Batch-Tool.
java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
... 4 more
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission c:\tmp\log.txt read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkRead(Unknown Source)
at java.io.File.exists(Unknown Source)
at HelloLiveConnect.fileExists(HelloLiveConnect.java:17)
... 14 more
Ich kann da jetzt nur mutmaßen. Der Browser/VM lässt das Applet aus seiner Sandbox, wenn das Zertifikat akzeptiert wurde und es kann schalten und walten wie eine Applikation. Wenn es nicht akzeptiert wurde, wird eine AccessControlException geworfen. So weit zum Java-Teil.
Im JavaScript-Teil, sagst du, greifst du direkt auf die Methode zu. Für mich klingt das so, als würdest du damit die Java-Sicherheitsmechanismen umgehen wollen. Und warscheinlich für die VM auch, denn die quittiert den direkten Aufruf einer unsicheren Methode mit der AccessControlException.
Also meiner Meinung nach müsstest du das Applet starten und dann auf eine sichere Methode zugreifen, um den ermittelten Wert auszulesen.
ich hätte jetzt vermutet das das Applet entweder in der Sandbox oder eben nicht läuft und das ist abhängig von der Signatur des Applets. Warum ein signiertes Applet dennoch in de Sandbox läuft nur weil eine Funktion von außen aufgerufen wird ist mir schleierhaft.
Und umgehen möchte ich damit sicherlich nichts. Der Nutzer muss schon der Signatur zustimmen.
Ich nehme an, das hier der Sicherheitsmechanismus von Java greift. Der Benutzer hat ja nur dem Applet erlaubt, sich auf seinem System zu bewegen. Jetzt kommt irgendwer von "draußen" und ruft ungefragt kritische Operationen auf. Meinst du nicht, das sowas geblockt werden sollte?
Zumal ich ja von außen nur Zugriff auf die public Methoden/Variablen des Applets habe, sprich ich selbst von außen nichts anderes machen könnte als das was das Applet nicht sowieso macht.
Und wenn es ein "böses" Applet ist, dann liegt es nicht am Zugriff von außen auf das Applet.
Nein, definitiv nicht. Ich warte bis das Applet geladen hat und ich die Ausgabe in der Konsole "Alles OK" bekomme. Hab diese noch eingebaut um eben genau das auszuschließen.