Domanda

Ho un applet Java in esecuzione su Tomcat 5.5. E 'firmato (-selfcert). Ho ancora un'eccezione java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader), quando il mio applet tenta di connettersi a un webservice (già in questa linea):

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

Dal momento che ci sono alcune domande simili qui, un Li leggo:

  • Sì, l'applet è firmata. Ho controllato con -verify.

  • eccezione di protezione Tomcat, può essere, ma ho aggiunto al catalina.policy:

    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; };

e la solita roba del genere è anche in là:

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

senza alcun risultato.

Ok, rapido aggiornamento, aggiungendo:

grant{
        permission java.security.AllPermission;
};

per il file java.policy locale risolve il problema. MA non questo è quello che sto cercando, l'applet dovrebbe girare su una macchina avarage, con dafault di file java.policy. Così deve essere fissata all'interno del codice.

È stato utile?

Soluzione

Come si chiama il vostro WS dal thread principale applet o da un thread avviato da una chiamata al metodo di dell'applet utilizzando JavaScript?

Si veda l'esempio qui sotto.

Speranza che aiuta.

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
    }
}

Altri suggerimenti

Impostazione delle autorizzazioni sul server non è la soluzione. E 'il responsabile della sicurezza nel browser che si lamenta.

La proposta di utilizzare AccessManager è indead obbligatoria o questo fallirà. Ma è anche necessario per fare la stessa cosa quando si chiama il webservice dall'inizio () o init ().

Posso chiedere: è il WebService chiamare l'unica ragione per cui si dispone di un applet? Potrebbe essere meglio mettere un servlet delega in atto per evitare restrizioni criteri di dominio Same. Quindi è possibile utilizzare puro HTML + javascript nel browser.

La chiamata in un applet da JS può fallire se lo si fa prima che l'applet è completamente avviato, così si dovrebbe aspettare il per essere pronti.

Se si utilizzano altre librerie (vasi) dal vostro applet, che interract con qualsiasi risorsa limitata, essi dovrebbero anche essere firmati. Quindi dare il tutto StackTrace, e il My_WebserviceLocator. (E non usare sottolineature). Per esempio prova ad accedere al axis.jar.

Come un soluzione temporanea , è possibile disattivare il SecurityManager. Naturalmente questo hanno alcuni problemi di sicurezza, ma almeno si sarà in grado di rintracciarlo al SecurityManager (vale a dire, un problema di autorizzazioni).

System.setSecurityManager(null);

Se questo funziona davvero, la mia ipotesi è che si sta configurando il file politica sbagliata. Quando si esegue un applet dal browser, sto quasi in modo che il programma di avvio applet sarà un JRE consumo regolare, non il JRE in bundle con il JDK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top