Frage

Ich wollte meine jdk6\jre\lib\security\java.policy Datei einige Klassen eine Untersagung hinzufügen zu erstellen, die von appengine die schwarze Liste gesetzt werden. Zum Beispiel möchte ich meinen lokaler Jvm eine Ausnahme ausgelöst, wenn die Anwendung javax.naming.NamingException zu instanziiert versucht.

Es ist möglich?

Ich werde versuchen, mein spezielles Problem hier zu erläutern. Google bietet einen Service (GAE-Google App Engine), die einige Einschränkungen auf, was Klassen verwendet werden können. Zum Beispiel instanziiert nicht JNDI-Klassen, die in javax.naming Paket sind. Sie bieten auch einen Test-Server, der auf meinem Rechner diese Anwendung Tests verwendet werden können, aber dieser Server erlaubt es, solche Klassen und kann den Code exacute. Sie finden heraus, dass Sie eine schwarze Liste gesetzt Klasse verwendet nur, nachdem Sie Ihre Anwendung laden googeln. Ich dachte, wenn eine solche Klasse schwarze Liste Durchsetzung nicht auf die Entwicklung Jvm getan werden könnte. Else Ich denke, dass dies einfach sein würden sie bereits eine solche Politik-Datei zur Verfügung stellen könnten.

War es hilfreich?

Lösung

Sie können eine kleine Loader Anwendung schreiben, die eine , benutzerdefinierte Classloader . Ihre Anwendungsklassen dann geladen werden konnten diesen Classloader verwendet wird.

In dem benutzerdefinierten Klassenlader, können Sie dann ClassNotFoundException werfen, wenn die Anwendung versucht, eine Klasse zuzugreifen, die Sie zur Sperrliste hinzufügen.

Sie müssen die Last () -Methode zu überlasten. Diese Methode wird für das Werfen der Ausnahme auf die schwarze Liste gesetzt Klassen verantwortlich ordelegating an die Mutterclassloader, wenn die Klasse erlaubt ist. Eine Beispielimplementierung:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(Natürlich kann eine echte Umsetzung anspruchsvoller sein Weg als das)

Da die Klassen Ihrer Anwendung werden über diese Classloader geladen, und Sie delegieren nur die loadclass () invokations an die Mutterclassloader, wenn Sie möchten, können Sie alle Klassen schwarze Liste, die Sie benötigen.

Ich bin mir ziemlich sicher, dass dies die Methode, die Google verwendet Klassen in ihrem Server schwarze Liste. Sie laden jede App in einem bestimmten Classloader. Dies ist auch ähnlich wie die Art und Weise, die Tomcat, die verschiedenen Web-Anwendungen isoliert.

Andere Tipps

Möchten Sie lieber nicht Kompilierungsfehlern als Laufzeitfehler erhalten, während Ihr Programm testen? Sie könnten Ihre IDE oder Compiler konfigurieren Sie zu warnen, wenn eine unerwünschte Klasse instanziiert wird. Ich weiß, dass AspectJ einige nette Features für diese hat: Sie können auf beitreten Punkte Kompilierung Warnungen / Fehler definieren und erhalten Feedback in z.B. Finsternis. Um dies zu verwenden in Eclipse, installieren Sie einfach die AspectJ-Plugin und schreiben einen geeigneten Aspekt. Um die Fehler zu erhalten, während von einer Befehlszeile oder ein Skript kompiliert, würden Sie tatsächlich die AspectJ-Compiler verwenden müssen, aber ich bezweifle, dass Sie das benötigen würden.

Die Java Dokumentation listet alle möglichen politischen Berechtigungen hier: http://java.sun.com/javase/ 6 / docs / technotes / guides / security / permissions.html

Klasse creation / Laden nicht erwähnt wird, so glaube ich, dies über eine Politik nicht durchsetzen können.

Auf jeden Fall, warum wollen Sie eine Ausnahme ausgelöst, wenn eine Ausnahmeklasse geladen wird? Vielleicht könnten Sie Ihr Problem erklären, dann könnte jemand eine Lösung vorschlagen kann.

Edit:

Eine Möglichkeit Laden bestimmter Klassen zu verhindern, wäre sie von der JRE-Installation zu entfernen. Die meisten Systemklassen werden in rt.jar in Ihrer JDK / JRE-Installation enthalten ist. Sie sollten es mit jedem ZIP-Tool ändern können.

Nur eine spezielle Installation des JRE erstellen, und seine rt.jar ändern. Das ist ein hässlicher Hack, sollte aber für Testzwecke in Ordnung sein ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top