7.7 Sicherheitsfragen mit dem SecurityManager klären
In der Laufzeitumgebung sind spezielle Ausnahmen für den Fall definiert, dass das System Operationen nicht zulässt, die das gerade laufende Programm gerne ausführen möchte. In einem Applet lassen sich beispielsweise keine Dateien löschen, da ein Sicherheitsmanager dies verhindert. In dem Fall, dass der Applet-Programmierer einen Zugriff auf das Dateisystem versucht, wird im Applet eine SecurityException vom Sicherheitsmanager ausgelöst.
7.7.1 Programm beenden
Die statische Methode exit() aus der Systemklasse gibt den Wunsch, die JVM komplett zu beenden, an die Laufzeitumgebung weiter, die durch ein Runtime-Objekt repräsentiert ist. So delegiert die Implementierung von exit() der Klasse System die ganze Arbeit direkt an die Methode exit() der Klasse Runtime:
public static void exit(int status) {
Runtime.getRuntime().exit(status);
}
Dürfen wir beenden? Ein detaillierter Blick auf die Implementierung
In der Methode exit() von Runtime taucht die Frage auf, ob ein Programm die gesamte JVM beenden darf. Über den SecurityManager folgt die Anfrage mit checkExit(), ob die Berechtigung zum Beenden der Laufzeitumgebung existiert. Wenn wir die JVM schließen dürfen, beendet die native Methode exitInternal(int) die Anwendung. Es ist die Aufgabe von exitInternal(), die von der JVM benutzten Ressourcen freizugeben:
public void exit( int status )
{
SecurityManager security = System.getSecurityManager();
if ( security != null )
security.checkExit(status);
Shutdown.exit(status);
}
Applets dürfen zum Beispiel nicht die gesamte JVM beenden, da alle Applets auf derselben Web-Seite in derselben JVM ablaufen und gegeneinander abgeschirmt werden müssen. Für Applets liefert getSecurityManager() eine Referenz ungleich null, und die checkExit()-Methode dieses SecurityManager-Exemplars löst eine SecurityException aus, um dem Applet das Beenden der JVM zu verbieten. Natürlich dürfen Applets auch den SecurityManager nicht mit setSecurityManager() verändern und so den Schutz aushebeln.
|