Pergunta

Eu tenho um applet Java em execução no Tomcat 5.5. É assinado (-SelfCert). Eu ainda recebo um java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader) Exceção, quando meu applet tenta se conectar a um serviço da web (já nesta linha):

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

Como existem algumas perguntas semelhantes aqui, e eu as li:

  • Sim, o applet está assinado. Eu verifiquei com -verify.

  • Exceção de segurança do Tomcat, pode ser, mas eu adicionei ao 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 as coisas usuais como também estão lá:

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

sem resultado.

Ok, atualização rápida, adicionando:

grant{
        permission java.security.AllPermission;
};

Para o arquivo java.policy local corrige o problema. Mas não é isso que estou procurando, o applet deve ser executado em uma máquina Avarage, com o arquivo dafault java.policy. Portanto, ele deve ser corrigido dentro do código.

Foi útil?

Solução

Você chama seu WS do tópico principal do applet ou de um thread iniciado por uma chamada para o método do applet usando JavaScript?

Veja o exemplo abaixo.

Espero que ajude.

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

Outras dicas

Definir permissões no servidor não é a solução. É o gerente de segurança no navegador que reclama.

O uso proposto do AccessManager é obrigatório ou isso falhará. Mas você também precisa fazer o mesmo ao ligar para o WebService de Start () ou init ().

Posso perguntar: o serviço da web é o único motivo pelo qual você tem um applet? Pode ser melhor estabelecer um servlet proxy para evitar as mesmas restrições de políticas de domínio. Em seguida, você pode usar o HTML + JavaScript puro no navegador.

Chamar um applet do JS pode falhar se você fizer isso antes que o applet seja totalmente iniciado, portanto, você deve esperar que o applet esteja pronto.

Se você estiver usando outras bibliotecas (potes) do seu applet, isso se interrompa com qualquer recurso restrito, elas também devem ser assinadas. Então, dê todo o Stacktrace e o My_WebServiceLocator. (E não use sublinhados). Por exemplo, tente assinar o eixo.jar.

Como um solução alternativa temporária, você pode desativar o SecurityManager. É claro que isso tem alguns problemas de segurança, mas pelo menos você poderá acompanhá -lo ao SecurityManager (ou seja, um problema de permissões).

System.setSecurityManager(null);

Se isso realmente funciona, meu palpite é que você está configurando o arquivo de política errado. Ao executar um applet do navegador, estou quase Claro que o Applet Launcher será um consumidor regular JRE, não o JRE empatado com o JDK.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top