Frage

Ich habe ein Java-Applet auf Tomcat 5.5 ausgeführt wird. Es ist signiert (-selfcert). Ich bekomme immer noch eine java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader) Ausnahme, wenn mein Applet versucht, einen Webservice (bereits in dieser Zeile) zu verbinden:

ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl",
                new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice"));

Da gibt es einige ähnliche Fragen sind hier, i las sie:

  • Ja, das Applet signiert ist. Ich habe es mit -verify.

  • Tomcat Sicherheitsausnahme, sein kann, aber ich habe zu catalina.policy hinzugefügt:

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" {
        permission java.security.AllPermission;    };
    

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar" { permission java.security.AllPermission; };

und die üblichen Sachen wie auch drin:

grant codeBase "file:${java.home}/jre/lib/ext/-" {
        permission java.security.AllPermission;
};

ohne Ergebnis.

Ok, schnelles Update, und fügte hinzu:

grant{
        permission java.security.AllPermission;
};

auf die lokale java.policy Datei behebt das Problem. Aber das ist nicht das, was ich suche, das Applet auf einer avarage Maschine, mit dafault java.policy Datei ausgeführt werden soll. So hat es aus dem Code festgelegt werden.

War es hilfreich?

Lösung

Haben Sie Ihre WS aus dem Applet Haupt-Thread aufrufen oder aus einem Thread durch einen Aufruf initiiert das Verfahren unter Verwendung von JavaScript-Applet?

Siehe Beispiel unten.

Hope es hilft.

public class MyApplet extends JApplet {

    @Override
    public void start() {
        // It will work if your applet is signed
        callWebService();
    }

    public void methodCalledFromJavascriptWrong() {
        // It will NOT work even if your applet is signed
        callWebService();

    }

    public void methodCalledFromJavascriptGood() {
        AccessController.doPrivileged(new PrivilegedAction() {

            public Object run() {
                // It will work if your applet is signed
                callWebService();
                return null;
            }

        });

    }

    private void callWebService() {
        //Here you call your web service
    }
}

Andere Tipps

Festlegen von Berechtigungen auf dem Server ist nicht die Lösung. Es ist der Sicherheitsmanager im Browser, der klagt.

Die vorgeschlagene Verwendung von Accessmanager ist indead obligatorisch oder dies fehl. Aber auch das gleiche tun müssen, wenn Sie den Webservice von Anfang () aufrufen oder init ().

Darf ich frage: ist der WebService, den einzigen Grund nennen, warum Sie ein Applet haben? Es könnte besser sein, ein Proxy-Servlet in Stelle zu setzen gleiche Domain-Richtlinienbeschränkungen zu vermeiden. Dann können Sie reinen HTML + Javascript in Ihrem Browser verwenden.

Der Aufruf in ein Applet von JS kann fehlschlagen, wenn Sie es tun, bevor das Applet vollständig gestartet wird, so dass Sie für das Applet bereit sein, warten sollen.

Wenn Sie andere Bibliotheken verwenden (Gläser) von Ihrem Applet, dass interract mit jeder eingeschränkten Ressourcen, sollten sie auch unterschrieben werden. So gibt die ganze Stacktrace und die My_WebserviceLocator. (Und nicht Unterstrichen verwenden). Zum Beispiel versuchen, die axis.jar unterzeichnen.

Als vorübergehende Lösung können Sie die Securitymanager deaktivieren. Natürlich sind diese haben einige Sicherheitsprobleme, aber zumindest werden Sie in der Lage sein, sie auf der Spur zu dem Securitymanager (dh ein Berechtigungsproblem).

System.setSecurityManager(null);

Wenn dies tatsächlich funktioniert, meine Vermutung ist, dass Sie die falsche Richtliniendatei konfigurieren. Wenn ein Applet vom Browser ausgeführt wird, ich bin fast sicher, dass das Applet Launcher eine regelmäßiger Verbraucher JRE sein wird, nicht die jre mit dem JDK gebündelt.

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