Question

J'ai une applet java en cours d'exécution sur tomcat 5.5. Il est signé (-selfcert). Je reçois encore une exception java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader), quand mon Applet essaie de se connecter à un webservice (déjà dans cette ligne):

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

Comme il y a des questions similaires ici, un je les lis:

  • Oui, l'applet est signé. Je l'ai vérifié avec -verify.

  • exception de sécurité Tomcat, peut-être, mais je l'ai ajouté à 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; };

et les trucs habituels comme est là-dedans:

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

sans résultat.

Ok, mise à jour rapide, en ajoutant:

grant{
        permission java.security.AllPermission;
};

au fichier java.policy locale résout le problème. Mais c'est pas ce que je cherche, l'applet devrait fonctionner sur une machine avarage, avec dafault fichier java.policy. Donc, il doit être fixé à l'intérieur du code.

Était-ce utile?

La solution

Avez-vous appeler WS depuis le thread principal applet ou d'un fil initié par un appel à la méthode de l'applet en utilisant le javascript?

Voir exemple ci-dessous.

it helps.

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

Autres conseils

Définition des autorisations sur le serveur n'est pas la solution. Il est le responsable de la sécurité dans le navigateur qui se plaint.

L'utilisation proposée de AccessManager est indead obligatoire ou cela ne fonctionne pas. Mais il faut aussi faire la même chose lorsque vous appelez le webservice du début () ou init ().

Puis-je demander: est le WebService appeler la seule raison pour laquelle vous avez une applet? Il pourrait être préférable de mettre un servlet proxy en place pour éviter les restrictions mêmes de la politique de domaine. Ensuite, vous pouvez utiliser pur HTML + Javascript dans le navigateur.

L'appel dans une applet de JS peut échouer si vous le faites avant l'applet est complètement démarré, vous devriez donc attendre que l'applet pour être prêt.

Si vous utilisez d'autres bibliothèques (pots) de votre applet, qui interract avec une ressource restreinte, ils devraient également être signés. Alors, donnez l'ensemble stacktrace et le My_WebserviceLocator. (Et ne pas utiliser underscores). Par exemple essayer de signer la axis.jar.

En tant que solution temporaire , vous pouvez désactiver le SecurityManager. Bien sûr, cela a des problèmes de sécurité, mais au moins vous serez en mesure de le suivre jusqu'à la SecurityManager (c.-à-un problème d'autorisations).

System.setSecurityManager(null);

Si cela fonctionne bien, je suppose que vous configurez le fichier de mauvaise politique. Lors de l'exécution d'une applet dans le navigateur, je suis presque vous que le lanceur d'applet sera régulièrement JRE des consommateurs, et non le jre livré avec le JDK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top